博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
策略模式
阅读量:4597 次
发布时间:2019-06-09

本文共 3109 字,大约阅读时间需要 10 分钟。

策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
    
    
   
设计原则:
    
    
    
    
   
   
1、找出应用中可能需要变化的地方,把它们独立出来,不要和那些不需要变化的代码混在一起。
    
    
    
    
   
   2、针对接口编程,而不是针对实现编程;
                      3、多用组合,少用继承。
举例:

    两种表现行为,即要实现两个算法族,封装为两个接口,分别是QuackBehavior和FlyBehavior接口: 

1 package com.nwpulisz.strategypattren;2 public interface QuackBehavior {3     public void quack();4 }
1 package com.nwpulisz.strategypattren;2 public interface FlyBehavior {3     public void fly();4 }

 

    通过封装具体的类分别实现两个接口,即实现具体的算法:
    
 
继承QuackBehavior接口的类有如下两个(可以理解为两种实现Quack的算法,一个算法族):
1 package com.nwpulisz.strategypattren;2 public class Quack implements QuackBehavior {3     public void quack() {4         // TODO Auto-generated method stub5         System.out.println("Quack");6     }7 }
1 package com.nwpulisz.strategypattren;2 public class MuteQuack implements QuackBehavior {3     public void quack() {4         // TODO Auto-generated method stub5         System.out.println("Mute Quck");6     }7 }

 

 
 
继承FlyBehavior接口的类有如下两个,两中实现Fly的算法:
1 package com.nwpulisz.strategypattren;2 public class FlyNoWay implements FlyBehavior {3     public void fly() {4         // TODO Auto-generated method stub5         System.out.println("fly no way");6     }7 }
1 package com.nwpulisz.strategypattren;2 public class FlyWithWings implements FlyBehavior {3     public void fly() {4         // TODO Auto-generated method stub5         System.out.println("fly with wings");6     }7 }
    
   
 
定义Duck抽象类:
1 package com.nwpulisz.strategypattren; 2 public abstract class Duck { 3     FlyBehavior flyBehavior;    //为行为接口类型声明两个引用变量,所有鸭子的子类都会继承它们; 4     QuackBehavior quackBehavior; 5     public Duck(){ 6          7     } 8     public abstract void display(); 9     10     public void performFly(){11         flyBehavior.fly();   //行为的执行委托给行为类;12     }13     public void performQuack(){14         quackBehavior.quack();15     }16     17     public void setFlyBehavior(FlyBehavior flyBehavior) {18         this.flyBehavior = flyBehavior;19     }20     public void setQuackBehavior(QuackBehavior quackBehavior) {21         this.quackBehavior = quackBehavior;22     }23         24 }

 

定义一个Duck类的子类MallardDuck:
1 package com.nwpulisz.strategypattren; 2 public class MallardDuck extends Duck { 3     public MallardDuck(){ 4         quackBehavior=new Quack();  //构造器中指定行为类; 5         flyBehavior= new FlyWithWings(); 6     } 7     @Override 8     public void display() { 9         // TODO Auto-generated method stub10         System.out.println("Mallar Duck");11     }12 }
 
建立一个测试类:
1 package com.nwpulisz.strategypattren; 2 public class DuckSimulator { 3      4     public static void main(String[] args) { 5         // TODO Auto-generated method stub 6         Duck mallard = new MallardDuck(); 7         mallard.performQuack();   //构造器中指定行为类,output:Quack; 8         mallard.performFly();  //构造器中指定行为类,output:fly with wings; 9         10         mallard.setFlyBehavior(new FlyNoWay());    //调用set方法,可以动态改变行为;11         mallard.setQuackBehavior(new MuteQuack());  //调用set方法,可以动态改变行为;12         mallard.performQuack(); //output:Mute Quck;13         mallard.performFly();  //output:fly no way;14     }15 }

 

 
 

 

转载于:https://www.cnblogs.com/nwpulisz/p/5380084.html

你可能感兴趣的文章
backbone collection add 事件回调参数
查看>>
转载:XGBOOST算法梳理
查看>>
EM算法
查看>>
istringstream。PKU2493 Rdeaalbe。
查看>>
linux监控系统的状态
查看>>
编码风格
查看>>
Linux的ls命令在Windows中的应用
查看>>
4.Spring注解+SpringMVC注解+MyBatis注解(动态sql)
查看>>
算法导论 CLRS 24.1-5 解答
查看>>
接了个私单,结果对方有部分尾款迟迟不付,还好有留了个后门
查看>>
keep the bar green to keep the code clean——Junit详解(二)
查看>>
system表空间空间解决(ORA-00604 ORA-01653 ORA-02002)
查看>>
【原创】敏捷软件产品/项目开发管理流程(一)
查看>>
Node.js中的express框架,修改内容后自动更新(免重启),express热更新
查看>>
团队每日冲刺04
查看>>
oracle中的decode的使用
查看>>
PHP生成中文验证码并检测对错实例
查看>>
数据库经典练习题整理
查看>>
android与javaee通信:登录界面超级简化版
查看>>
Nhibernate3.3.3sp1基础搭建测试
查看>>