博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
设计模式之策略模式
阅读量:4357 次
发布时间:2019-06-07

本文共 2099 字,大约阅读时间需要 6 分钟。

策略模式定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。也就是把算法封装起来,方便改变,减少耦合。

组合:把两个类结合起来使用。增加弹性,不仅可以将算法族封装成类,更可以“在运行时动态的地改变行为”,只要组合的行为对象符合接口标准就行了。

比如一个抽象类,加一个接口,接口封装各种方法,抽象类就只被继承主要的公共功能,让其他子类达到更好的代码重用,和实现其他方法。

设计原则:

1.找出应用中可能需要变化之处,把它们独立出来,不要和那些不需要变化的代码混在一起。

(封装变化的部分,方便修改和扩展)

2.针对接口编程,而不是针对实现编程,

利用接口代表方法,可以实现多个接口,而继承只能有一个,松耦合,高内聚。

(“有一个”和“是一个”)有一个可以实现接口,动态的绑定或者分离。是一个就是继承,绑定住了,不方便维护。

3.多用组合,少用继承。

 需求:一个鸭子模型,公共功能是游泳,会变化的功能是飞;  

解决:1.创建一个抽象鸭类  其中有一个 FlyBehavior 接口,这样的行为就是一个组合。

package com.CeNveMoShiTest;/** * 策略模式:将一族算放封装起来,互相替换,并且对客户没有影响 * 实现:一个抽象鸭类,一个飞行接口,一个木头鸭类,一个会飞的鸭类 *声明行为接口类型的两个变量,给鸭子子类继承 */public abstract class Duck {    FlyBehavior flyBehavior;  //飞行行为,都是接口  方便组合    public Duck() {    }    public void setFlyBehavior(FlyBehavior fb){            flyBehavior = fb;    }    public abstract void display();    public void performFly() {        flyBehavior.fly();    }    public  void swim(){        System.out.println("都会游泳");    }}

2.飞行接口的两个不同实现,会飞和不会飞的两个类

package com.CeNveMoShiTest;/** * Created by Administrator on 2017/10/13 0013. */public interface FlyBehavior {   public void  fly();}package com.CeNveMoShiTest;/** * Created by Administrator on 2017/10/13 0013. */public class FlyNoWay implements FlyBehavior {    @Override    public void fly() {        System.out.println("不会灰");    }}package com.CeNveMoShiTest;/** * Created by Administrator on 2017/10/13 0013. */public class FlyWithWings implements FlyBehavior {    @Override    public void fly() {        System.out.println("会灰");    }}

3.建一个模型鸭的子类,继承父类,并且使用组合的方法调用接口的实现方法;而不需要重新实现接口

package com.CeNveMoShiTest;/** * Created by Administrator on 2017/10/13 0013. */public class ModelDuck extends Duck {    @Override    public void display() {        System.out.println("一只模型鸭子");    }    public static void main(String[] args) {      Duck du = new ModelDuck();      du.display();      du.swim();     du.setFlyBehavior(new FlyWithWings());  // du 调用父类的set方法,参数是创建一个接口的实现类,实现该接口的方法      du.performFly(); //才会实现        du.setFlyBehavior(new FlyNoWay());        du.performFly();    }}

 

转载于:https://www.cnblogs.com/JavaBlackHole/p/7662759.html

你可能感兴趣的文章
学习进度十五
查看>>
C# windows服务的创建与调试
查看>>
Socket开发框架之数据传输协议
查看>>
设计模式02----工厂设计模式(3种)
查看>>
F2工作流引擎模型
查看>>
64:数据流中的中位数
查看>>
常用排序算法之--快速排序
查看>>
php实现设计模式之 简单工厂模式
查看>>
学好Mac常用命令,助力iOS开发
查看>>
asp.net core 通过 TeamCity 实现持续集成笔记
查看>>
定制起始url(scrapy_redis)
查看>>
VS2015 遇到异常。这可能是由某个扩展导致的
查看>>
Tomcat启动时选择加载项目
查看>>
android博客
查看>>
Shell排序——软考(五)
查看>>
jQuery EasyUI API 中文文档 - 搜索框
查看>>
盘古分词,记灵一下
查看>>
PHP投票练习
查看>>
Java事件处理机制- 事件监听器的四种实现方式【转】
查看>>
CSS3伪类选择器:nth-child()
查看>>