【设计模式】变化和不变化的代码进行分离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
- 如何使用 Bootstrap 搭建更合理的 HTML 结构
- Java遍历Map对象的四种方式
- java 线程public void run()中值如何返回
- Jackson与spring框架整合的坑
- spring shiro整合时自动注入的问题
- mybatis获取update的id
- 点击!AWD攻防解题技巧在此!
- Docker 基础技术之 Linux namespace 详解
- Centos6下使用yum安装MariaDB
- Linux下部署Samba服务环境的操作记录
- SCP和Rsync远程拷贝的几个技巧
- Linux服务器更换主板后,网卡识别失败的处理方法
- CTF| 吃个鸡,一起破流量分析题吧!
- centos7下安装php+memcached简单记录
- 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 数组属性和方法
- 单机KVM虚拟化快照定时创建删除快照
- 批量ping脚本
- 批量ssh信任脚本
- Oracle表级备份
- Linux脚本运行报错解决方法 bad interpreter: No such file or directory
- MySQLdump里的秘密,终于被我发现了
- HTTP各种特性总览
- django查询今天,昨天,一周,分组统计月,年
- 关于 z-index,你可能一直存在误区
- Java浮点数机制及所存在的问题
- SAP UI5和React的页面渲染性能比较
- SAP CDS view自学教程之一:如何测试基于SAP CDS view自动生成的OData服务
- SAP CDS view自学教程之二:当SAP CDS view被激活时,背后发生了什么
- SAP Fiori Elements原理介绍之类型为Value Help的Smart Field工作原理
- 万字详述 MySQL ProxySQL