策略模式(strategy)是指把定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换,策略模式让算法独立于使用它的客户而独立变化。策略模式实现需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数。

策略模式的优点:使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是低耦合的关系。低耦合的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

策略模式中有三个对象:

1)环境对象(Context):该类中实现了对抽象策略中定义的接口或者抽象类的引用。

2)抽象策略对象(Strategy):它可由接口或抽象类来实现。

3)具体策略对象(ConcreteStrategy):它封装了实现同不功能的不同算法。

应用场景:

假设张三要到北方做买卖,走之前张三的父亲给仆人三个锦囊,说是危机关头按顺序依次拆开能解决相应的问题。场景中出现三个要素:妙计(具体策略类)、锦囊(环境事件类)、仆人(调用者)。

抽象策略类(Strategy)

public interface Strategy {  
     public void operate();  
}

妙计一,初到北方地界,实现类:

public class NorthernBoundary implements IStrategy {  
     @Override  
     public void operate() {  
  System.out.println("钱财打通官府,求照应,方便行事");  
     }  
}

妙计二,在当地开展买卖事宜,实现类:

public class UnderstandingCustomsCulture implements IStrategy {  
     @Override  
     public void operate() {  
  System.out.println("了解当地风俗文化");  
     }  
}

妙计三,地皮流氓闹事,官府快速接入处理,实现类:

public class AccessProcessing implements IStrategy {  
     @Override  
     public void operate() {  
  System.out.println("地皮流氓闹事,官府快速接入处理");  
     }  
}

环境事件类(Context):

public class ContextEvent {  
     private Strategy strategy;  
     //构造函数 
     public ContextEvent(Strategy strategy){  
  this.strategy = strategy;  
     }  
     public void setStrategy(Strategy strategy){  
  this.strategy = strategy;  
     }  
     public void operate(){  
  this.strategy.operate();  
     }  
}

简单测试类:

public class BlogYoodb {  
  
    public static void main(String[] args) {  
ContextEvent context;  
System.out.println("----------初到北方地界使用锦囊一---------------");  
context = new ContextEvent(new NorthernBoundary());  
context.operate();  
System.out.println("\n");  
System.out.println("----------开展买卖事宜使用锦囊二---------------");  
context.setStrategy(new UnderstandingCustomsCulture());  
context.operate();  
System.out.println("\n");  
System.out.println("----------地皮流氓闹事,使用锦囊三---------------");  
context.setStrategy(new AccessProcessing());  
context.operate();  
System.out.println("\n");  
    }  
}

关注下方微信公众号“Java精选”(w_z90110),回复关键词领取资料:如Mysql、Hadoop、Dubbo、Spring Boot等,免费领取视频教程、资料文档和项目源码。

Java精选专注程序员推送一些Java开发知识,包括基础知识、各大流行框架(Mybatis、Spring、Spring Boot等)、大数据技术(Storm、Hadoop、MapReduce、Spark等)、数据库(Mysql、Oracle、NoSQL等)、算法与数据结构、面试专题、面试技巧经验、职业规划以及优质开源项目等。其中一部分由小编总结整理,另一部分来源于网络上优质资源,希望对大家的学习和工作有所帮助。

评论

分享:

支付宝

微信