码迷,mamicode.com
首页 > 其他好文 > 详细

策略模式

时间:2016-04-11 22:27:33      阅读:264      评论:0      收藏:0      [点我收藏+]

标签:

策略模式:定义了算法族,分别封装起来,让它们之间可以相互替换,此模式让算法的变化独立于使用算法的客户。
    
       设计原则:
                      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 stub
5         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 stub
5         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 stub
5         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 stub
5         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 stub
10         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 }

 

 
 

 



策略模式

标签:

原文地址:http://www.cnblogs.com/nwpulisz/p/5380084.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!