策略模式--经典详细分析

 

1、先举例下面的一个列子

下面看一个网上流传最广泛的例子:门和警报的例子:门都有open( )和close( )两个动作,此时我们可以定义通过抽象类和接口来定义这个抽象概念:

abstract class Door {
    public abstract void open();
    public abstract void close();
}

但是现在如果我们需要门具有报警alarm( )的功能,那么该如何实现?下面提供两种思路:

  1)将这三个功能都放在抽象类里面,但是这样一来所有继承于这个抽象类的子类都具备了报警功能,但是有的门并不一定具备报警功能;

  2)将这三个功能都放在接口里面,需要用到报警功能的类就需要实现这个接口中的open( )和close( ),也许这个类根本就不具备open( )和close( )这两个功能,比如火灾报警器。

  从这里可以看出, Door的open() 、close()和alarm()根本就属于两个不同范畴内的行为,open()和close()属于门本身固有的行为特性,而alarm()属于延伸的附加行为。因此最好的解决办法是单独将报警设计为一个接口,包含alarm()行为,Door设计为单独的一个抽象类,包含open和close两种行为。再设计一个报警门继承Door类和实现Alarm接口。

interface Alram {
    void alarm();
}
 
abstract class Door {
    void open();
    void close();
}
 
class AlarmDoor extends Door implements Alarm {
    void oepn() {
      //....
    }
    void close() {
      //....
    }
    void alarm() {
      //....
    }
}

上面这个在面试的时候经常遇到。

策略模式就是在上面的思想上演变而来的,我们来分析下

首先鸭子有共同的特性,我们就定义一个基类,不同的鸭子集成实现共同特性的方法。

现在要实现鸭子会飞,会飞是一个特别的行为,我们使用接口实现

飞有很多种飞的方式,就对应不同的策略

对飞行行为的解释:
FlyWithWings用翅膀飞。
FlyNoWay:不会飞。
FlyRocketPowered:使用火箭动力飞行(鸭子的飞行行为可以动态改变)。

我们来看看具体的实现类

public class GreenheadDuck extends  Duck {


   public GreenheadDuck(){
       flyable=new FlyNoWay();
   }
    @Override
    public void display() {
        // TODO Auto-generated method stub
        System.out.println("I am greenhead");
    }
}

这就是策略模式的本质,采用继承和接口的方式实现了策略模式

转载于:https://www.cnblogs.com/kebibuluan/p/7738934.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值