首页 > 其他 > 详细

设计模式之策略模式

时间:2019-09-06 13:44:07      阅读:76      评论:0      收藏:0      [点我收藏+]
策略模式定义:分别封装行为接口,实现算法族,超类里放行为接口的对象,在子类里具体设定行为对象。原则就是:分离变化部分,封装接口,基于接口编程各种功能。此模式让行为算法的变化独立于算法的使用者。
好处:新增行为简单,行为类更好的复用,组合更方便。既有继承带来的复用好处,没有挖坑
 
闲话少说上代码:
定义一个飞行接口,里面有一个没有方法体的飞行动作:
public interface Fly {
    void fly();
}
定义一个叫接口,里面有一个没有方法体的叫动作:
public interface Call {
    void call();
}

因为飞行和叫声是变化的,会有各种各样的飞行和叫声,所以我们要把不同的飞行和叫声都实现

public class GoodFly implements Fly {
    @Override
    public void fly() {
        System.out.println("飞的好");
    }
}

public class BadFly implements Fly {
    @Override
    public void fly() {
        System.out.println("飞的坏");
    }
}

public class GuaCall implements Call {
    @Override
    public void call() {
        System.out.println("呱呱叫");
    }
}

public class GaCall implements Call {
    @Override
    public void call() {
        System.out.println("嘎嘎叫");
    }
}

这样我们就有了各种各样的飞行和叫声。

然后我们要创建鸭子的基础类,基础类会持有动作的接口但是没有声明具体的动作

public abstract class Duck {
    Fly dfly;
    Call dcall;
    public Duck(){}
    public void fly(){
        dfly.fly();
    }
    public void call(){
        dcall.call();
    }
}

在基础类的子类中会具体设置是哪一种动作

class GreenHeadDuck extends Duck{
    public GreenHeadDuck(){
        dcall=new GaCall();
        dfly=new GoodFly();
    }
}

public class RedHeadDuck extends Duck {
    public RedHeadDuck(){
        dfly=new BadFly();
        dcall=new GuaCall();
    }

    public static void main(String[] args) {
        Duck rduck=new RedHeadDuck();
        rduck.fly();
        rduck.call();

        Duck gduck=new GreenHeadDuck();
        gduck.fly();
        gduck.call();
    }
}

策略模式的注意点:

  1. 分析项目中变化部分与不变部分  
  2. 多用组合少用继承;用行为类组合,而不是行为的继承。更有弹性  

 

设计模式之策略模式

原文:https://www.cnblogs.com/liuqing666/p/11474258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!