【设计模式】变化和不变化的代码进行分离day01
时间:2022-07-23
本文章向大家介绍【设计模式】变化和不变化的代码进行分离day01,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
设计原则
找出应用中可能需要的变化之处,把他们独立出来(封装),不要和哪些不需要变化的代码混在一起
实际举例
- 我们实现一个鸭子,且这个鸭子有很多种,且有各个属性。我们应该如何设计这个鸭子呢?
- 首先鸭子不变的属性有哪些? 外观,游泳。等(先定义这两个)
- 鸭子变的属性有哪些? 有的会叫,有的会飞等
- 那我们怎么去定义 红鸭子,黑鸭子,还有玩具鸭子?
show me code
- 由于鸭子都会游泳和有外观,那么我们创建一个最基础的鸭子
package 设计模式;
/**
* @author yuanxindong
* @date 2020/7/4 12:38 上午
*/
public abstract class Duck {
/**
* 由于不是所有的外形都是一样的所以定义一个可以被实现外形的抽象方法
*/
public abstract void disPlay();
//所有的鸭子都会呱呱叫,所以这个行为可以放在基类里面,
// 由于有部分鸭子不会游泳所以不能写在基类上
// String quack() {
// return "呱呱挂";
// }
/**
* 所有的鸭子都能游泳
*
* @return
*/
String Swim() {
return "游泳ING";
}
}
- 刚开始我们使用抽象类,定义一个鸭子,且将有可能有不同的颜色的情况轻易为抽象方法,这个抽象方法可以起到一个约束的作用,意思也就是你是鸭子必须有外观。
package 设计模式;
/**
* @authoryuanxindong
* @date: 2020/7/4 12:57 上午
*/
public interface FlyAble {
void fly();
}
package 设计模式;
import io.netty.handler.codec.mqtt.MqttUnsubAckMessage;
/**
* @author yuanxindong
* @date 2020/7/4 12:58 上午
*/
public interface QuackAble {
void quack();
}
package 设计模式;
/**
* @authoryuanxindong
* @date: 2020/7/4 12:58 上午
*/
public interface SwingAble {
void Swing();
}
- 但是由于不同的鸭子有可能不会飞也不会叫如橡皮鸭,所以这种情况下,我们就得想法实现了,要么在实现的每个鸭子里面写下自己的属性。这样的花会产生大量的重复代码,所以我们可以通过接口定义,将几种行为方式起一个接口。继承整个接口且实现就可以轻松的展示自己的特点了。还有就是我们定义了接口后还会被其他的属性使用,比如狗也会叫等等。
- 通过接口和抽象方式定义各个鸭子
package 设计模式;
/**
* @author yuanxindong
* @date 2020/7/4 12:43 上午
*/
public class BlackDuck extends Duck implements SwingAble{
/**
* 由于是继承于Duck的且duck是没有被实现的,所以duck必须要定义这个
* 这个约束让代码变得规范
*/
@Override
public void disPlay() {
System.out.println("我是一个黑鸭子");
}
@Override
public void Swing() {
System.out.println("游泳高手");
}
}
package 设计模式;
/**
* @author yuanxindong
* @date 2020/7/4 12:55 上午
*/
public class RubberDuck extends Duck implements SwingAble {
/**
* 这个鸭子只有外观
*/
@Override
public void disPlay() {
System.out.println("灰色");
}
@Override
public void Swing() {
System.out.println("游泳");
}
}
总结
- 在设计代码的时候:将不变的和经常变得代码分开。
- 实现的方式:可以通过抽象类和接口的继承和实现的方式。
参考
《Head first 设计模式》
软件开发一个不变的真理:CHANGE
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 在Windows10 Bash中默认启动其他shell By HKL,
- 基于R的竞争风险模型的列线图
- 安装zabbix的windows系统agent By HKL,
- NetBSD使用sysupgrade工具更新系统 By HKL,
- asterisk服务器的sip、iax2中继对接 By HKL,
- 用Windows10自带PowerShell获取文件Hash(MD5、SHA1/256)值得方法 By H
- 移除Blog对jQuery的依赖 By HKL, Tues
- 通过expect脚本在H3C设备批量执行命令 By HKL,
- 使用python的paramiko加flask模块实现H3C设备实时ssh信息查询 By HKL,
- MotherBoard JCOM to DB9 female By HKL,
- PHP实现根据请求的域名跳转到不同目录 By HKL, T
- frp定时监控脚本 By HKL, Tuesday 13
- iptables上入站流量同时启用DNAT和SNAT By HKL,
- tasker调用钉钉机器人实现短信转钉钉 By HKL,
- EdgeCore AS6700 ONIE Firmware固件 For HWr01c By HKL,