标签:接口 方法 实例 引用 可变 抽象类 动态 好的 测试
1、定义
将可变的部分从程序中抽象分离成算法接口,在该接口下分别封装一系列算法实现并使他们可以互相替换,从而导致客户端程序独立于算法的改变
2、组合与策略模式
继承是重用代码的利器,但继承并不总是最好的方式,还有组合方式:在类中增加一个私有域引用另一个已有的类的实例,通过调用引用实例的方法从而获得新的功能,这种设计被称作组合(复合)
定义策略接口-FlyStragety
public interface FlyStragety { void performFly();//飞行能力 }
策略接口实现1-FlyNoWay
public class FlyNoWay implements FlyStragety { public void performFly() { System.out.println("我不会飞啊"); } }
策略接口实现2-FlyWithWin
public class FlyWithWin implements FlyStragety { public void performFly() { System.out.println("我会飞行"); } }
定义抽象类
public abstract class Duck { private FlyStragety flyStragety;//面向接口编程 public Duck(FlyStragety flyStragety) { this.flyStragety = flyStragety; } public void quack(){//鸣叫 System.out.println("嘎嘎嘎..."); } abstract void display();//外观 /** * 提供公有的方法,面向接口编程使用动态绑定特性执行具体实现 */ public void fly(){ flyStragety.performFly(); } }
定义Duck的子类1-RedDuck
public class RedDuck extends Duck { public RedDuck(FlyStragety flyStragety) { super(flyStragety); } @Override void display() { System.out.println("我是红脖子鸭子"); } }
定义Duck的子类2-RubberDuck
public class RubberDuck extends Duck { public RubberDuck(FlyStragety flyStragety) { super(flyStragety); } @Override void display() { System.out.println("全身发黄,嘴巴很红"); } }
说明:
测试方法:
public class DuckTest { @Test public void testDuck(){ Duck duck=new RedDuck(new FlyWithWin()); // Duck duck=new RubberDuck(new FlyNoWay()); duck.display(); duck.quack(); duck.fly(); } }
3、策略模式的实现
从上述实例基本可以看出怎样使用策略模式:
4、策略模式的适用场景
标签:接口 方法 实例 引用 可变 抽象类 动态 好的 测试
原文地址:https://www.cnblogs.com/shixiemayi/p/9612836.html