设计模式之策略模式

初读《Head First 设计模式》第一章,特此记录
个人见解,不当之处,欢迎留言 || 私信

策略模式定义:策略模式定义了算法簇,分别封装起来,让他们之间可以互相转换,此模式让算法的变化独立于使用算法的客户。

定义看的一脸懵逼,还是直接show code or picture(图拍自书本)
这里写图片描述
纠正错误:图中左边实现和右边IS-A换个位置
图片看不清,可以右击下载,或者在新标签中打开

  1. 模型:模拟鸭子游戏,游戏中出现各种鸭子,一边游泳戏水,一边呱呱叫,可能会出现会飞的鸭子等后期维护工作

  2. 策略模式设计:鸭子Duck作为一个抽象类,拥有鸭子都会有的方法swim,display等,同时Has-A鸭子的行为FlyBehavior和QuackBehavior,可以动态修改鸭子的行为,表现为set*方法,perform*方法调用performFly.fly()或者performFly.quack()

  3. 鸭子的行为(注意是行为行为行为)设计为接口,具体实现IS-A行为接口

  4. 在设计过程中,书中提出了Duck为何设计成抽象类而不是接口,就顺便记录下自己对抽象类和接口在应用中的理解。抽象类是模板,是模型,就如医生用的处方本子一样,已经具有了特定的格式和特定的说明,如本例中的鸭子抽象类,所有鸭子都会具有swim,display等方法,和继承类是IS-A的关系,本质上是相同的;接口是行为,是标准,与其实现类是一种“like-a”的关系,之间没有本质的联系,如鸭子的行为fly和quack,如果有一个鸭鸣器(学鸭子叫声,诱捕鸭子),它也可以实现这种quack的行为。

  5. 组合(composition):每个鸭子有两个行为,将两个类结合起来使用,便是组合,即鸭子的行为不是继承来的,而是“组合”来的

  6. 设计原则:找出应用中可能需要变化的,独立出来;针对接口编程,而不是针对实现编程;多用组合,少用继承

  7. 个人理解:策略模式,以书中Duck模型来解释,鸭子模型,它具有很多不确定的行为,即实现类具有一个或者多种行为,但又不确定具体的那个行为,这个时候可以设计鸭子的每个行为为接口;鸭子模型为抽象类,并定义所有实现它的模型所具有的行为或者功能,同时这个抽象类将鸭子的行为(接口) 组合 进来,再对接口进行操作,注意此时我们只是在操作所有要实现抽象类的的超类,并不知道具体的实现或者哪个类在操作,只有在具体实现类实现的时候,才会知道操作的是哪个类,这大概也就是面向接口编程吧

  8. 代码结构如图:
    这里写图片描述
    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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值