软件构造之策略设计模式
程序员文章站
2022-03-10 14:14:43
...
策略设计模式
定义
Strategy模式是一种行为型设计模式,它将算法一个个封装起来,在某一时刻能够互换地使用其中的一个算法。从概念上看,所有这些算法完成的都是相同的工作,只是实现不同而已。
应用实例
在实验中,实验文件给出了这样的要求:
在文本文件较大、图规模较大的时候,I/O 的效率将影响程序整体性能。 为此,请采用至少 3 种不同的 Java I/O 策略对你程序中文件 I/O 进行改进,尽最大可能提高 I/O 效率,例如:
Stream
Reader/Writer
Buffer/Channel
Scanner
java.nio.file.Files
你认为合理的其他 I/O 机制
这里面就需要使用策略模式来实现各种I/O策略
以下是策略模式的一个实例:
package com.cbf4life.strategy;
首先定一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口
public void operate();
}
然后再写三个实现类,有三个妙计嘛:
package com.cbf4life.strategy;
public class BackDoor implements IStrategy {
public void operate() {
System.out.println("找乔国老帮忙,让吴国太给孙权施加压力"); }
package com.cbf4life.strategy;
public class GivenGreenLight implements IStrategy {
public void operate() {
System.out.println("求吴国太开个绿灯,放行!"); }
}
package com.cbf4life.strategy;
public class BlockEnemy implements IStrategy {
public void operate() {
System.out.println("孙夫人断后,挡住追兵"); }
}
好了,大家看看,三个妙计是有了,那需要有个地方放这些妙计呀,放锦囊呀:
package com.cbf4life.strategy;
public class Context { //构造函数,你要使用那个妙计
public Context(IStrategy strategy)
//使用计谋了,看我出招了
public void operate(){ this.straegy.operate(); } }
然后就是赵云雄赳赳的揣着三个锦囊,拉着已步入老年行列的、还想着娶纯情少女的、
色迷迷的刘老爷子去入赘了,嗨,还别说,小亮的三个妙计还真是不错,瞅瞅:
package com.cbf4life.strategy;
public class ZhaoYun {
public static void main(String[] args) {
Context context;
//刚刚到吴国的时候拆第一个
context.operate(); //拆开执行 System.out.println("\n\n\n\n\n\n\n\n");
//刘备乐不思蜀了,拆第二个了
System.out.println("-----------刘备乐不思蜀了,拆第二个了-------------");
context = new Context(new GivenGreenLight());
context.operate(); //执行了第二个锦囊了 System.out.println("\n\n\n\n\n\n\n\n");
//孙权的小兵追了,咋办?拆第三个
System.out.println("-----------孙权的小兵追了,咋办?拆第三个 -------------");
context = new Context(new BlockEnemy());
context.operate(); //孙夫人退兵 System.out.println("\n\n\n\n\n\n\n\n");
/* 问题来了:赵云实际不知道是那个策略呀,他只知道拆第一个锦囊,
*而不知道是BackDoor这个妙计,咋办? 似乎这个策略模式已经把计谋名称写出来了
*错!BackDoor、GivenGreenLight、BlockEnemy只是一个代码,你写成first、
second、 third,没人会说你错!
* 策略模式的好处就是:体现了高内聚低耦合的特性}
}
借鉴与实现
在实验中,我的实现如下:
package Strategy;
import java.io.IOException;
import exceptions.EdgeTypeException;
import exceptions.HyperEdgeNumException;
import exceptions.TestPraseException;
import exceptions.VertexTypeException;
import exceptions.WeightNotIntException;
import graph.ConcreteGraph;
public class Context {
private IOStrategy strategy;
public Context(IOStrategy strategy){
this.strategy=strategy;
}
public ConcreteGraph operate(String filename){
try {
return this.strategy.operate(filename);
} catch (IOException | TestPraseException | VertexTypeException | EdgeTypeException | HyperEdgeNumException
| WeightNotIntException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
}
就这样,用策略模式实现I/O中最关键的一步就实现好了,剩下的只需要往锦囊里添加具体实现就可以了。
最终的实现包如下:
上一篇: 学php以后做什么?
下一篇: 软件构造笔记-布局技术