作为开篇。有必要说明下。写文章不是我的强行,只是作为一个记录而已
首先 对于策略模式给一个定义吧!策略模式:定义了算法簇,分别对其进行了封装,他们之间可以互换。这样做的话,可以让算法的变化独立于算法的客户端!
这里先举一个鸭子的实例。对于一个鸭子,他有很多行为,比如叫,飞行,但不同种类的的鸭子,它有不同的行为。所以可能会有下面这种做法
package com.ssh.exercise;
public class Duck {
public void swim() {
System.out.println("所有鸭子都会游泳!");
}
public void quack(){
System.out.println("quack");
}
public void fly(){
System.out.println("fly");
}
}
具体的实例去实现覆盖对应的方法,如下面的代码所示:
package com.ssh.exercise;
public class WoodDuck extends Duck{
@Override
public void quack() {
System.out.println("呱呱叫");
}
@Override
public void fly() {
System.out.println("木头鸭不会叫");
}
}
但这样做的结果是:为了复用的目的而使用继承,反而效果不佳,一来并不是所有子类都具备超类的行为,代码在多了子类中重复,也很难知道所有鸭子的全部行为,运行时行为不容易改变,改变一个,会造成其他鸭子不想要的改变!
看到这里,你可能会想到把fly,quack从超类中单独出去,定义flyable,quackable的接口,子类来实现。虽然这样的做法,可以解决一部分的问题,但只是从一个噩梦到另外一个噩梦,想想,java是单继承的,如果,在会飞的鸭子里面,飞行动作又有其他变化呢。会不会造成代码无法复用,如果有很多子类,那么去修改那么多子类的飞行或者叫的行为不觉得很麻烦么?
想想开篇的定义,定义算法族,就是把可变化的东西提取出来,封装!
那我们就可以如下做:先定义fly和quack的接口,不同的飞行行为,或者喊叫的行为去实现对应的接口,这样一来对于不同的鸭子,就只要实现行为的实现类就可以了,代码比较简单。我就不贴了。
策略模式的设计原则:找出应用中可能需要变化之处,把他们独立起来,不要和那些不需要变化的代码混合在一起。尽量针对接口编程。不要针对实现编程,多用组合,少用继承
分享到:
相关推荐
设计模式--策略模式java例子
c++设计模式-行为型模式-策略模式;qt工程;c++简单源码; 策略(Strategy)模式的定义:该模式定义了一系列算法,并将每个算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。策略模式属于...
设计模式---策略者模式---根据《Head First 设计模式》自己实现
设计模式-策略模式-c++版 压缩包中有build好的程序和工程设计到的所有类的源码,还有一个Uml类图
设计模式--策略模式StrategyPattern
JAVA-设计模式-行为型模式-策略模式
java设计模式--策略模式 HeadFirst书中的 装饰者模式
C++设计模式--基于Qt4开源跨平台开发框架
设计模式-策略模式源代码 .net,策略模式,模式,设计模式 文件包中有UML策略模式详解图
设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式设计模式--代理模式
java常用设计模式-策略模式
好东西一定得分享,自己现阶段需要好好学习一下QT。C++设计模式--基于Qt4开源跨平台开发框架 完整清晰版中文PDF。好东西而且分数不贵!解压密码qt。
c#设计模式-C#设计模式c#设计模式-C#设计模式c#设计模式-C#设计模式c#设计模式-C#设计模式
北大青鸟关于设计模式的PPT,讲述的非常清晰,对于初学设计模式的人来说,非常有用。本篇是关于策略模式的PPT
JAVA设计模式--程序设计--反射--注解--泛型
免费提供个人设计模式简易代码,代码结构层次清晰,并且内含基本所有的注释,非常有利于初学者学习设计模式
c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--基于Qt4开源跨平台开发框架(源代码)c++设计模式--...
深入浅出设计模式(C#版)--策略模式--示例代码
26种设计模式 ------------------- 26种设计模式 -------------------
设计模式专题之(十六)策略模式---设计模式策略模式示例代码(python--c++)