设计模式一:策略模式(Strategy Pattern)
今天从图书馆借了本 Head First设计模式,小看了一章,感觉挺不错的所以写下来当作备忘:
书里关于这个模式的定义是:定义了算法族,分别封闭起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户.以下是一个简单的实例,具体的流程是:
先把公共的信息定义在一个父类或者是父接口中,该父类或者父接口中的变量用的都是接口类型(这些接口类型都有其实现的具体子类,暂称为a吧),然后在实现或者继承了父接口或者父类的子类(暂称为b)中针对的是父类或者父接口中的接口进行编程,最后在测试类或者是具体功能类中只需实例化a后赋给针对接口类型编程的地方,这样一来就可以实现具体算法与具体用户之间的独立和替换;
首先是父接口:
package com.jie.pattern;public interface Duck {public IFly fly=null; //这里两个都是接口类型public ICry cry=null; // public void display();}
package com.jie.pattern;public interface IFly {public void fly();}
package com.jie.pattern;public interface ICry {public void cry();}
package com.jie.pattern;public class FlyDuck implements Duck{public IFly fly=null;public FlyDuck(){}public void setFly(IFly fly){this.fly=fly;}public void fly(){fly.fly();}public void display(){System.out.println("Fly's duck...");}}
package com.jie.pattern;public class FlyDuck implements Duck{public IFly fly=null;public FlyDuck(){}public void setFly(IFly fly){this.fly=fly;}public void fly(){fly.fly();}public void display(){System.out.println("Fly's duck...");}}
package com.jie.pattern;public class Test {/** * @param args */public static void main(String[] args) {// TODO Auto-generated method stubFlyDuck flyDuck=new FlyDuck();flyDuck.setFly(new SubFly());//这里可以用实现了接口的具体类的实例来进行替代;flyDuck.fly();}}
public class ConcreteStrategy { puvlic void 攻击(){}; } public class ConcreteStrategy火 extends ConcreteStrategy { puvlic void 攻击(){ //发出三昧真火 }; } public class ConcreteStrategy毒 extends ConcreteStrategy { puvlic void 攻击(){ //发出唐门无色无味,闻着倒 }; } public class content { public void 战场( String 敌人特征){ if (敌人特征==("怕火")){ ConcreteStrategy 自已的策略= new ConcreteStrategy火(); 自已的策略.攻击(); } if (敌人特征=="怕毒"){ ConcreteStrategy 自已的策略= new ConcreteStrategy毒(); 自已的策略.攻击(); } } }
public class ConcreteStrategy { puvlic void 攻击(){}; } public class ConcreteStrategy火 extends ConcreteStrategy { puvlic void 攻击(){ //发出三昧真火 }; } public class ConcreteStrategy毒 extends ConcreteStrategy { puvlic void 攻击(){ //发出唐门无色无味,闻着倒 }; } public class content { public void 战场( String 敌人特征){ if (敌人特征==("怕火")){ ConcreteStrategy 自已的策略= new ConcreteStrategy火(); 自已的策略.攻击(); } if (敌人特征=="怕毒"){ ConcreteStrategy 自已的策略= new ConcreteStrategy毒(); 自已的策略.攻击(); } } }