策略模式
来源:互联网 发布:算法工程师课程 编辑:程序博客网 时间:2024/06/07 11:03
策略模式是把算法和使用算法的客户分离,使用组合的方式让他们之间产生联系的方法。
复用是继承具有的最大优势之一,但同时也可能给维护带来很大的包袱。
比如在使用多态时,有些子类的具体行为可能有区别,这时你的第一反应可能是覆盖这个方法,但如果这个区别在一直拓展呢?你要把每个子类中的方法全部覆盖一遍么,那么继承还有存在的意义吗?
这种情况就是策略模式登场的时候了。
策略模式的方法是:把这些行为与超类分离,单独封装,子类采用组合的方式自己实现自己的各种行为。超类不知道,也不关心每个子类具体的行为是什么,只知道子类具有这些行为就可以了。这样,既有了继承带来的复用的好处,又不会出现上面所出现的被实现绑死的问题,整个结构变得更加灵活,可拓展。
下面看一下代码:
飞行行为的接口:
public interface FlyBehaviour { void Fly(); }具体飞行行为1: public class FlyWithWings : FlyBehaviour { public void Fly() { Console.WriteLine("用翅膀飞"); } }具体飞行行为2: public class FlyNoWings : FlyBehaviour { public void Fly() { Console.WriteLine("没有翅膀飞不起来"); } }叫声行为的接口: public interface QuackBehavior { void Quack(); }具体叫声行为1: public class QuackGua : QuackBehavior { public void Quack() { Console.WriteLine("呱呱叫"); } }具体叫声行为2: public class QuackGa : QuackBehavior { public void Quack() { Console.WriteLine("嘎嘎叫"); } }超类:超类具有行为1和行为2的具体实例,这样所有子类都拥有这两个行为,但是超类不知道也不关心子类具体是什么行为!而且超类应该制造两个公有方法给外界调用这两个行为,以保护两个行为的实例。因为所有鸭子都具有游的行为,所以所有子类直接复用就好。 public abstract class Duck { protected FlyBehaviour flyB; protected QuackBehavior quackB; public void ShowFly() { flyB.Fly(); } public void ShowQuack() { quackB.Quack(); } public void Swim() { Console.WriteLine("游啊游"); } }子类1:子类自己决定具体的飞行行为和叫声行为是什么! public class RedheadDuck : Duck { public RedheadDuck() { flyB = new FlyWithWings(); quackB = new QuackGua(); } }子类2:子类自己决定具体的飞行行为和叫声行为是什么! public class DonaldDuck : Duck { public DonaldDuck() { flyB = new FlyNoWings(); quackB = new QuackGa(); } } class Program { static void Main(string[] args) { Duck duck1 = new RedheadDuck(); duck1.ShowFly(); duck1.ShowQuack(); Duck duck2 = new DonaldDuck(); duck2.ShowFly(); duck2.ShowQuack(); } }
阅读全文
0 0
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 策略模式
- 23_Jsp_3指令_7动作_登录应用
- Android混合开发之WebView使用总结
- head标签内的设置
- 无人驾驶路上:激光雷达和摄像头都干了些什么?
- 24_Jsp_9大内置对象_4大域对象
- 策略模式
- markdown一些技巧(1)
- 输入某年某月某日,判断这一天是这一年的第几天?
- 25_mvc入门
- Anaconda python各模块简介
- ffplay源码剖析(3.2.4 + sdl2)(2):初始化与解复用
- 26_mvc入门案例
- kotlin的网络请求
- 27_el表达式