初读《Head First 设计模式》第一章,特此记录
个人见解,不当之处,欢迎留言 || 私信
策略模式定义:策略模式定义了算法簇,分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户。
定义看的一脸懵逼,还是直接show code or picture(图拍自书本)
纠正错误:图中左边实现和右边IS-A换个位置
图片看不清,可以右击下载,或者在新标签中打开
模型:模拟鸭子游戏,游戏中出现各种鸭子,一边游泳戏水,一边呱呱叫,可能会出现会飞的鸭子等后期维护工作
策略模式设计:鸭子Duck作为一个抽象类,拥有鸭子都会有的方法swim,display等,同时Has-A鸭子的行为FlyBehavior和QuackBehavior,可以动态修改鸭子的行为,表现为set*方法,perform*方法调用performFly.fly()或者performFly.quack()
鸭子的行为(注意是行为行为行为)设计为接口,具体实现IS-A行为接口
在设计过程中,书中提出了Duck为何设计成抽象类而不是接口,就顺便记录下自己对抽象类和接口在应用中的理解。抽象类是模板,是模型,就如医生用的处方本子一样,已经具有了特定的格式和特定的说明,如本例中的鸭子抽象类,所有鸭子都会具有swim,display等方法,和继承类是IS-A的关系,本质上是相同的;接口是行为,是标准,与其实现类是一种“like-a”的关系,之间没有本质的联系,如鸭子的行为fly和quack,如果有一个鸭鸣器(学鸭子叫声,诱捕鸭子),它也可以实现这种quack的行为。
组合(composition):每个鸭子有两个行为,将两个类结合起来使用,便是组合,即鸭子的行为不是继承来的,而是“组合”来的
设计原则:找出应用中可能需要变化的,独立出来;针对接口编程,而不是针对实现编程;多用组合,少用继承
个人理解:策略模式,以书中Duck模型来解释,鸭子模型,它具有很多不确定的行为,即实现类具有一个或者多种行为,但又不确定具体的那个行为,这个时候可以设计鸭子的每个行为为接口;鸭子模型为抽象类,并定义所有实现它的模型所具有的行为或者功能,同时这个抽象类将鸭子的行为(接口) 组合 进来,再对接口进行操作,注意此时我们只是在操作所有要实现抽象类的的超类,并不知道具体的实现或者哪个类在操作,只有在具体实现类实现的时候,才会知道操作的是哪个类,这大概也就是面向接口编程吧
代码结构如图:
9.具体实现:
//Duck类
public abstract class Duck {
//这里组合了两个行为
public FlyBehavior flyBehavior;
public QuackBehavior quackBehavior;
//每个实现类都必须具有的行为
public abstract void display();
//这个以及下面的set方法都是对接口的操作,并不知道具体实现
public void performFly(){
this.flyBehavior.fly();
}
public void performQuack(){
this.quackBehavior.quack();
}
public void swim(){
System.out.println("duck can swim!");
}
public void setFlyBehavior(FlyBehavior flyBehavior){
this.flyBehavior = flyBehavior;
}
public void setQuackBehavior(QuackBehavior quackBehavior){
this.quackBehavior = quackBehavior;
}
}
//FlyBehavior接口
public interface FlyBehavior {
public void fly();
}
//QuackBehavior接口
public interface QuackBehavior {
public void quack();
}
//Quack,具体的鸭子行为
public class Quack implements QuackBehavior{
@Override
public void quack(){
System.out.println("鸭子呱呱叫!");
}
}
//NoFlyWithWings,具体的鸭子行为
public class NoFlyWithWings implements FlyBehavior {
@Override
public void fly() {
System.out.println("i can not fly!");
}
}
//FlyWithWings,具体的鸭子行为
public class FlyWithWings implements FlyBehavior{
@Override
public void fly() {
System.out.println("i can fly!");
}
}
//HeadRedDuck,鸭子的实现类
public class HeadRedDuck extends Duck{
public HeadRedDuck(){
flyBehavior = new FlyWithWings();
quackBehavior = new Quack();
}
@Override
public void display() {
System.out.println("i an headRedDuck!");
}
}
测试类在图片中可以看到
这是另一篇关于使用lambda表达式简化策略模式的,有兴趣可以看一下
http://blog.csdn.net/qq_38888706/article/details/79067519