策略模式

来源:互联网 发布:vb中ascii码 编辑:程序博客网 时间:2024/09/21 06:34

原文链接:http://blog.csdn.net/u011593278/article/details/9738475

策略模式设计原则

a) 封装变化的概念

b) 编程中使用接口,而不是对接口的实现,面向接口编程;

 

策略模式的意义

a) 策略模式使开发人员能够开发出由许多可替换的部分组成的软件,并且各个部分之间是弱连接的关系。

b) 弱连接的特性使软件具有更强的可扩展性,易于维护;更重要的是,它大大提高了软件的可重用性。

策略模式的组成

a) 抽象策略角色:策略类,通常由一个接口或者抽象类实现

b) 具体策略角色:包装了相关的算法和行为

c) 环境角色:持有一个策略类的引用,最终给客户端调用的。

 

策略模式的编写步骤

a) 对策略对象定义一个公共接口。

b) 编写策略类,该类实现了上面的公共接口

c) 在使用策略对象的类中保存一个对策略对象的引用。

d) 在使用策略对象的类中,实现对策略对象的set和get方法(注入)或者使用构造方法完成赋值

 

策略模式的缺点

a) 客户端必须知道所有的策略类,并自行决定使用哪一个策略类。

b) 造成很多的策略类。

 

解决方案:采用工厂方法。


package com.zp.pattern.strategy;public interface Strategy {public int caculate(int a,int b);}package com.zp.pattern.strategy;public class Add implements Strategy {@Overridepublic int caculate(int a, int b) {return a + b;}}package com.zp.pattern.strategy;public class Multiple implements Strategy {@Overridepublic int caculate(int a, int b) {return a * b;}}package com.zp.pattern.strategy;public class Environment {//这是父类的引用,创建的对象可以将指向子类对象的引用赋给父类引用;private Strategy strategy;public Environment(Strategy strategy){this.strategy = strategy;}public Strategy getStrategy() {return strategy;}public void setStrategy(Strategy strategy) {this.strategy = strategy;}//父类引用指向子类对象,这里的strategy已经指向对应子类对象;public int caculate(int a,int b){return strategy.caculate(a,b);}}package com.zp.pattern.strategy;public class Test {public static void main(String[] args) {Strategy add = new Add();Environment e1 = new Environment(add);System.out.println(e1.caculate(3,4));Multiple multiple = new Multiple();Environment e2 = new Environment(multiple);System.out.println(e2.caculate(3,4));}}

结果:7   12

 

 注:主要应用了多态,父类引用指向子类对象,通过父类引用这一个变量,接收多个子类对象,由于父类引用已经通过构造器的初始化指向了子类对象,所以父类引用的调用相当于子类对象的调用,策略模式中既有类的封装,又有面向接口的编程 


原创粉丝点击