软件构造之策略设计模式

策略设计模式

定义

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中最关键的一步就实现好了,剩下的只需要往锦囊里添加具体实现就可以了。
最终的实现包如下:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39584132/article/details/80690664