首页 > 其他分享 >设计模式(2)--策略模式

设计模式(2)--策略模式

时间:2023-01-06 10:34:47浏览次数:34  
标签:-- 子类 celuemoshi 模式 void swimbehavior flyBehavior 设计模式 public


引入:

  • 模拟鸭子项目:
  • 从面向对象的角度设计这个项目,共同有一个gaga()叫,一个swim()方法,但是有一个display()方法不相同,所以前两个相同就在 父类中实现,剩下一个在父类中是抽象方法在子类中实现。
  • 但是随着使用会添加新的需求,这时候扩展性如何体现,如果放到父类中同时实现具体实现,这时候就直接代码复用就可以提高使用效率,但是有些子类是不会实现那种功能的,所以可以使用在子类中覆盖,但是这个时候因为在父类中实现的功能但是在子类中不需要,如果有很多子类那么代码的重复内容有很多。但是如果不在父类重谢,直接在 子类中写,但是这样做代码的复用性就会降低 。所以说超累挖一个坑,每个子类都要填,增加工作量,复杂度为O(n^2),不是好的设计方式
  • 需要新的设计方式,应对项目的扩展性,降低复杂度:
  • 分析项目的变化与不变化部分,提取变化的部分,抽象成接口+实现
  • 鸭子的哪些功能是会根据新需求变化的?叫声、飞行…
  • 策略模式定义:分别封装行为接口,实现算法族,超类里面放行为接口对象,在子类构造函数里具体设定行为对象
  • 原则就是:
  • 分离变化部分,封装接口,基于接口编程各种功能
  • 此模式让行为算法的变化独立于算法的使用者。

代码实例:

声明一个关于飞的行为接口

package celuemoshi.Impl;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:10
*/
public interface FlyBehavior {
void fly();
}

实现不同类型的飞比如会不会飞

package celuemoshi.ImplAble;


import celuemoshi.Impl.FlyBehavior;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:12
*/
public class GoodFly implements FlyBehavior {


@Override
public void fly() {
System.out.println("会飞");
}
}

实现抽象类Duck

package celuemoshi;


import celuemoshi.Impl.FlyBehavior;
import celuemoshi.Impl.Swimbehavior;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:14
*/
public abstract class Duck {
public void setFlyBehavior(FlyBehavior flyBehavior) {
this.flyBehavior = flyBehavior;
}


public void setSwimbehavior(Swimbehavior swimbehavior) {
this.swimbehavior = swimbehavior;
}


FlyBehavior flyBehavior;
Swimbehavior swimbehavior;
public Duck(){


}
public void Fly(){
flyBehavior.fly();
}
public void Swim(){
swimbehavior.swim();
}
public abstract void display();
}

实现某一个子类红鸭

package celuemoshi;


import celuemoshi.Impl.FlyBehavior;
import celuemoshi.Impl.Swimbehavior;
import celuemoshi.ImplAble.GoodFly;
import celuemoshi.ImplAble.GoodSwim;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:16
*/
public class RedDuck extends Duck {
FlyBehavior flyBehavior;
Swimbehavior swimbehavior;
public RedDuck(){
flyBehavior = new GoodFly();
swimbehavior = new GoodSwim();
setSwimbehavior(swimbehavior);
setFlyBehavior(flyBehavior);
}


@Override
public void display() {
System.out.println("我是红头鸭");
}
}

主函数:

package celuemoshi;


/**
* Created with IntelliJ IDEA.
* Description:
* User: wjx
* Date: 2019-04-17
* Time: 20:17
*/
public class DuckTest {
public static void main(String[] args) {
Duck redduck = new RedDuck();
redduck.display();
redduck.Fly();
redduck.Swim();


}
}


标签:--,子类,celuemoshi,模式,void,swimbehavior,flyBehavior,设计模式,public
From: https://blog.51cto.com/u_13987312/5992408

相关文章

  • RFID条形码标签软件丨CODESOFT功能简介
    RFID和条形码标签软件,铺就企业成功的基石 1、先进的条形码标签创建与集成2、智能的用户界面3、稳健可靠的数据库连接4、100多种条形码符号体系5、集标签和文......
  • 物联网APP开发简介
    物联网物联网(IoTInternetofThings,缩写IoT),核心的基础仍然是互联网,任何物品与物品之间的信息交换和通信,物联网通过射频识别(RFID),红外感应器,全球定位系统,激光扫描器等,把任何......
  • linux安装PHP5.6.30
    原文链接:https://blog.csdn.net/m0_55116875/article/details/121981413前言:当搭建PHP项目时,如果在搭建环境时缺少freetype,会导致访问nginx页面时,登录界面验证码无法成功......
  • 关于异或-异或运算及其应用
    概念异或,是一个数学运算符,英文为exclusiveOR,缩写为xor,应用于逻辑运算异或的数学符号为“⊕”,计算机符号为“xor”  如果a、b两个值不相同,则异或结果为1......
  • 设计模式(7)--单例模式
    单例模式的意义:用到的类的对象只能有一个(线程池,缓存,打印机等硬件设备)。如果多个实例会有造成冲突、结果不一致等问题可以用静态变量来指代这个对象来实现协商一个全局变量实......
  • linux定时任务
    1.Crontab命令文件保存在/var/spool/cron下crontab[-u<用户名称>][配置文件]或crontab{-l|-r|-e}-u#<用户名称>是指设定指定<用户名称>的定时任务,这个......
  • 混合模式(二)
    PorterDuffXfermode该模式针对的时在处理结果时以源图像显示为主的模式,主要有:Mode.SRC,Mode.SRC_IN,Mode.SRC_OUT,Mode.SRC_OVER和Mode.SRC_ATOPMode.SRC://全部以源图像......
  • .Net 7 内存模型函数描述结构MethoDesc
    楔子讲一些CLR里面的内存模型。本篇MethodDesc,意为函数的描述之意,看下一个函数在CLR里面是如何被描述的。MethodDesc结构这个结构体在CLR里面高达1600多行,这里仅截取......
  • 亚马逊UL测试报告详情
    UL认证和UL测试报告有那些区别1、UL检测报告:是根据产品选用相应UL标准进行测试合格后,出具合格的测试报告。(UL测试报告是针对亚马逊的)2、UL认证:UL认证自愿申请的,是全球认可度......
  • BitmapFactory.Options参数作用
    参数作用BitmapFactory.Options这个参数可以设置Bitmap的采样率,通过该比那图片的宽度、高度、缩放比例等,以达到减少图片的像素的目的,设置这个值可以更好的控制、显示和使用B......