设计模式之策略模式-笔记

xiaoxiao2021-02-28  52

策略模式: 定义了算法族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化独立于使用算法的客户,不同的子类可以调用不同的算法实现 设计原则:1、找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起  2、针对接口编程,而不针对实现编程,即利用接口代表每一个行为,而行为的每一个实现都将实现其中的一个接口,鸭子子类不需要负责实现Flying和Quacking接口,而是由专门的行为类进行实现,这样,鸭子类就不再需要知道行为的实现细节  3、多用组合,少用继承;使用组合建立的系统具有很大的弹性,不仅可以将算法族封装成类,更可以在运行时动态的改变行为,只要组合的行为对象符合正确的接口标准即可 场景:设计一个鸭子类,有些鸭子可以叫、可以飞,有些鸭子只是模型,叫声不一样,但不能飞,有些木鸭子既不能叫也不能飞 定义鸭子基类,将飞和叫的动作独立起来,可以定义接口,每个接口代表一个行为,如FlyBehavior 和QuackBehavior 两个接口分别代表行为飞和叫 //鸭子的基类 public abstract class Duck{ FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck(){} public abstract void display(); public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } //飞行为的接口 public interface FlyBehavior{ public void fly(); } //飞行行为 public class FlyWithWings implements FlyBehavior{ public void fly(){ System.out.println("I'm flying!!"); } } //不会飞 public class FlyNoWay implements FlyBehavior{ public void fly(){ System.out.println("I can't fly!!"); } } //叫行为的接口 public interface QuackBehavior{ public void quack(); } //真实鸭子的叫 public class Quack implements QuackBehavior{ public void quack(){ System.out.println("Quack"); } } //模型鸭子的叫 public class Squeak implements QuackBehavior{ public void quack(){ System.out.println("Squeak"); } } //真实鸭子的叫 public class MuteQuack implements QuackBehavior{ public void quack(){ System.out.println("Silence"); } } //真实鸭子子类 public class MallardDuck extends Duck{ public MallardDuck(){ quackBehavior = new Quack(); flyBehavior = new FlyWithWings(); } public void display(){ System.out.println("I'm a real Mallard duck!!"); } } //模型鸭子子类 public class ModelDuck extends Duck{ public ModelDuck(){ flyBehavior = new FlyNoWay(); quackBehavior = new Squeak(); } public void display(){ System.out.println("I'm a model duck!!") } } public class TestDuck{ public static void main(String[] args){ Duck mallard = new MallardDuck(); mallard.performFly(); mallard.performQuack(); mallard.display() Duck model = new ModelDuck(); model.performFly(); model.performQuack(); model.display(); } } //运行结果为: I'm flying!! Quack I'm a real Mallard duck!! I can't fly!! Squeak I'm a model duck!! //可以在Duck类中加入动态设定的方法 public abstract class Duck{ FlyBehavior flyBehavior; QuackBehavior quackBehavior; public Duck(){} public void setFlyBehavior(FlyBehavior fb){ flyBehavior = fb; } public void setQuackBehavior(QuackBehavior qb){ quackBehavior = qb; } public abstract void display(); public void performFly(){ flyBehavior.fly(); } public void performQuack(){ quackBehavior.quack(); } } 这样可以根据传入的飞行对象进行动态变化 如 定义一个 火箭飞行类 public class FlyRocketPowered implements FlyBehavior{ public void fly(){ System.out.println("I'm flying with a rocket!!"); } } // public class TestDuck{ public static void main(String[] args){ Duck mallard = new MallardDuck(); mallard.performFly(); mallard.performQuack(); mallard.display() Duck model = new ModelDuck(); model.performFly(); model.performQuack(); model.display(); model.setFlyBehavior(new FlyRocketPowered()); model.performFly(); } } //运行结果为: I'm flying!! Quack I'm a real Mallard duck!! I can't fly!! Squeak I'm a model duck!! I'm flying with a rocket!! 模型鸭子就可以动态改变自己的飞行行为或者叫声行为
转载请注明原文地址: https://www.6miu.com/read-40789.html

最新回复(0)