Java的设计模式----strategy(策略模式)
public abstract class Duck{public void quack(){ //呱呱叫System.out.println("呱呱叫");}public void swim(){ //游泳System.out.println(" 游泳");} public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/ }
对于它的子类只需简单的继承就可以了,并实现自己的display()方法。
//野鸭
public class MallardDuck extends Duck{public void display(){System.out.println("野鸭的颜色...");}}
//红头鸭
public class RedheadDuck extends Duck{public void display(){System.out.println("红头鸭的颜色...");} }
public abstract class Duck{public void quack(){ //呱呱叫System.out.println("呱呱叫");}public void swim(){ //游泳System.out.println(" 游泳");} public abstract void display(); /*因为外观不一样,让子类自己去决定了。*/public void fly(){System.out.println("飞吧!鸭子"); } }
对于不能飞的鸭子,在子类中只需简单的覆盖。
//残废鸭
public class DisabledDuck extends Duck{public void display(){System.out.println("残废鸭的颜色...");}public void fly(){//覆盖,变成什么事都不做。 } }
其它会飞的鸭子不用覆盖。
public interface Flyable{public void fly(); }public interface Quackable{public void quack();}
最后Duck的设计成为:
public abstract class Duck{public void swim(){ //游泳System.out.println(" 游泳");} public abstract void display(); /*因为外观不一样,让子类自 己去决定了。*/ }
而MallardDuck,RedheadDuck,DisabledDuck 就可以写成为:
//野鸭
public class MallardDuck extends Duck implements Flyable,Quackable{public void display(){System.out.println("野鸭的颜色...");}public void fly(){//实现该方法 }public void quack(){//实现该方法 }}
//红头鸭
public class RedheadDuck extends Duck implements Flyable,Quackable{public void display(){System.out.println("红头鸭的颜色...");}public void fly(){//实现该方法 }public void quack(){//实现该方法 } }
//残废鸭 只实现Quackable(能叫不能飞)
public class DisabledDuck extends Duck implements Quackable{public void display(){System.out.println("残废鸭的颜色...");}public void quack(){//实现该方法 } }
public interface FlyBehavior{public void fly(); }public interface QuackBehavior{public void quack();}
我们在定义一些针对FlyBehavior的具体实现。
public class FlyWithWings implements FlyBehavior{public void fly(){//实现了所有有翅膀的鸭子飞行行为。 }}public class FlyNoWay implements FlyBehavior{public void fly(){//什么都不做,不会飞 }}
针对QuackBehavior的几种具体实现。
public class Quack implements QuackBehavior{public void quack(){//实现呱呱叫的鸭子 } }public class Squeak implements QuackBehavior{public void quack(){//实现吱吱叫的鸭子 } }public class MuteQuack implements QuackBehavior{public void quack(){//什么都不做,不会叫 } }
点评一: 这样的设计,可以让飞行和呱呱叫的动作被其他的对象复用,因为这些行为已经与鸭子类无关了。而我们增加一些新
public abstract class Duck{ --------->在抽象类中,声明各接口,定义各接口对应的方法.FlyBehavior flyBehavior;//接口QuackBehavior quackBehavior;//接口public Duck(){}public abstract void display();public void swim(){//实现游泳的行为 }public void performFly(){flyBehavior.fly(); //-->由于是接口,会根据继承类实现的方式,而调用相应的方法.}public void performQuack(){quackBehavior.quack(); }}
看看MallardDuck如何实现。
----->通过构造方法,生成'飞','叫'具体实现类的实例,从而指定'飞','叫'的具体属性
public class MallardDuck extends Duck{public MallardDuck { flyBehavior = new FlyWithWings ();quackBehavior = new Quack(); //因为MallardDuck 继承了Duck,所有具有flyBehavior 与quackBehavior 实例变量}public void display(){//实现 }}
这样就满足了即可以飞,又可以叫,同时展现自己的颜色了。
public abstract class Duck{FlyBehavior flyBehavior;//接口QuackBehavior quackBehavior;//接口public void setFlyBehavior(FlyBehavior flyBehavior){this.flyBehavior = flyBehavior;}public void setQuackBehavior(QuackBehavior quackBehavior {this.quackBehavior= quackBehavior;}}
本文出自 “Changes we need ! ” 博客,请务必保留此出处http://shenzhenchufa.blog.51cto.com/730213/161581
转载于:https://www.cnblogs.com/orangesea/p/4075414.html
Java的设计模式----strategy(策略模式)相关推荐
- 设计模式——Strategy(策略)模式
目录 前言 1 定义 2 适用性 3 结构 3.1 结构图 3.2 参与者 4 实际应用举例 4.1 Context--List列表和StuContext 4.2 具体策略:ConcreteStrat ...
- [设计模式] —— Strategy 策略模式
文章目录 Strategy 策略模式 动机 定义 示例代码 结构图 总结 Strategy 策略模式 组件协作模式通过晚绑定,来实现框架与应用程序之间的松耦合.是框架和引用程序协作常用的. 动机 某些 ...
- C++设计模式之策略模式(Strategy)
Strategy策略模式 作用:定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化,不会影响到使用算法的客户. UML图: 代码实现 #include <iostream& ...
- java策略模式详解_Java经典设计模式之策略模式原理与用法详解
本文实例讲述了Java经典设计模式之策略模式.分享给大家供大家参考,具体如下: 策略模式指:策略模式指将程序中可变部分抽象分离成一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式 ...
- Java设计模式之策略模式与状态模式
一.策略模式定义 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使他们之间可以相互替换,策略模式可以在不影响客户端的情况下发生变化. 好了,定义看看就完了,我知道你很烦看定义. 二.策 ...
- Java设计模式之策略模式(UML类图分析+代码详解)
大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...
- 设计模式之策略模式(Java 实现)
设计模式之策略模式(Java 实现) 大家一定都使用过电子地图.在地图中输入出发地和目的地,然后再选取你的出行方式,就可以计算出最优线路以及预估的时长.出行方式有驾车.公交.步行.骑行等.出行方式不同 ...
- 设计模式之策略模式(Strategy)摘录
23种GOF设计模式一般分为三大类:创建型模式.结构型模式.行为模式. 创建型模式抽象了实例化过程,它们帮助一个系统独立于如何创建.组合和表示它的那些对象.一个类创建型模式使用继承改变被实例化的类,而 ...
- 揭秘设计模式:策略模式(Strategy)的枚举(Enum)实现
2019独角兽企业重金招聘Python工程师标准>>> 链接地址:http://www.xx566.com/detail/120.html 上一篇:揭秘设计模式:策略模式(Strat ...
最新文章
- Ext Scheduler Web资源甘特图控件
- Spring WebFlux和Spring Cloud开发响应式微服务
- Codeforces Round #671 (Div. 2)
- ubuntu14.04 通过PPA 安装ffmpeg
- close_wait过多服务器无响应,记一次大量CLOSE_WAIT连接导致的服务宕机
- kali linux关闭进程,技术|如何使用 Kali Linux 黑掉 Windows
- javascript浮点数学习总结之0.1+0.2
- pythonchallenge之C++学习篇-01
- webots python e-puck 集群通信案例
- good nice fine well区别
- Shell date连接mysql执行指令
- 自适应和响应式区别以及写法
- 多线程支持断点续传的文件传输--(摘自大富翁)
- NetSuite2.0 Restlet脚本 时间初始化脚本
- 常用的数量统计量的计算及统计意义
- 数据库-20210719(随手记)
- UBOOT I2C读写详解(基于mini2440)
- 手把手教你如何推广博客网站
- php 根据秒数计算时间戳,php时间戳秒数
- 网贷行业马太效应加剧,泰然金融稳居行业头部平台