欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

软件构造之策略设计模式

程序员文章站 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中最关键的一步就实现好了,剩下的只需要往锦囊里添加具体实现就可以了。
最终的实现包如下:
软件构造之策略设计模式

相关标签: java sc course