设计模式
主要来自对《研磨设计模式》、《图解设计模式》的理解和总结
thefist11
难以忘记编程路上领导和好友的细致指导,所以必须努力!(真诚希望大家多多指导!)
展开
-
Preview of “Design Pattern”
对软件设计中普遍存在(反复出现)的各种问题,所提出的解决方案。《孟子.告子篇》“冬日则饮汤,夏日则饮水”《孟子·离娄》 “不以规矩,不成方圆”《孟子·离娄》“不以六律,不能正五音”“兵来将挡,水来土掩”原创 2023-09-09 15:22:06 · 236 阅读 · 0 评论 -
《武术与设计模式》行为型
“行为型”原意:对象之间如何通信订阅者程序: 事物之前的通信,通过该机制,一个事物说,另外的事物能知道武林:黄忠与法正在定军山斩杀夏侯渊时,法正举白旗,黄忠收到消息表示不进攻。法正举红旗,黄忠收到进攻指示于是下山斩杀了夏侯渊。(此处通过举旗来进行通信)状态程序:事物有多种状态,经常在状态之前相互切换武林:两个人搏斗,一个人进攻,过了一会累了,他进入防守。(此处进攻和防守就是两种状态)中介程序:不相互联系,统一跟一个人(中介)联系武林:全真教弟子在演练天罡北斗阵时,马钰说一声“繁星原创 2023-09-03 17:13:41 · 245 阅读 · 0 评论 -
《武术与设计模式》结构性
“结构性”原意:将类或者对象结合在一起形成更大的结构代理程序:用某种方式代理真正的方式来处理事情。武林:比如以前经常有上门踢馆的事情,这个时候掌门人就会说“你要是能过得了我徒弟三招,才有资格跟我打”。徒弟替师傅接招这个事情就是代理,徒弟和师傅的接口一样,使用的都是本门招式和功夫。示例二,如果一个人要了解某个功夫是什么样的,武术家可以表演该功夫里面几个经典的招式。待这个人需要了解所有招式,再详细一一讲解。此处表演几个经典招式就是一种代理。(几个代替所有)适配者程序:源和目标的接口不一致原创 2023-09-03 15:56:54 · 271 阅读 · 0 评论 -
《武术与设计模式》创建型
“创建型”原意:创建对象的模式单例程序: 一个对象就存在一个武林:所谓“武林至尊,宝刀屠龙,号令天下,莫敢不从”,匠人在打造屠龙宝刀时,决定打造一件世间仅此一件的宝物。简单工厂程序:某种类型指代要创建的某种对象。武林:练习自由格斗或者散打时,教练会喊口号,学员通过相应口号出相应动作。比如“1”代表出前直拳,”2”代表出后直拳。这个学员通过口号来创建某种动作(对象)就是简单工厂。抽象工厂程序:产品族,有很多不同类型的不同产品。武林:少林功夫有大力金刚掌,少林镇山棍,武当派有太极拳、原创 2023-09-03 14:57:38 · 167 阅读 · 0 评论 -
设计模式总结 (5)行为型模式续
(6)策略还可以有不同的上下文(7) 备忘录careTaker通过中间人originator保存对象memento(保存对象状态、恢复状态), memento是内存变量,careTaker的保存和恢复可能是数据io。eg.undo/redo(8) 解释器eg. 叶子节点和父节点构成一个树//这个时候c不是终结了,需要把c修改成ElementExpressioinElementExpression root = new ElementExpression("root");ElementEx原创 2022-03-09 08:10:51 · 112 阅读 · 0 评论 -
设计模式总结 (5)行为型模式
(1)中介者eg. dialog上的各个子控件通过dialog通信eg2. 显卡、声卡、硬盘,cpu通过主板通信(2)观察者(3)迭代器iterator有一个Aggregage对象(4)状态有一种应用场景:状态之间可以相互切换(5)模板...原创 2022-03-04 07:05:53 · 224 阅读 · 0 评论 -
设计模式总结 (4)结构型模式
(1)适配器(2)代理模式(3) 命令模式(4) 组合(5)桥接模式(6)visit访问者acctpt调用visitor的visitConcreteElementA()方法或其他方法原创 2022-03-01 06:26:32 · 226 阅读 · 0 评论 -
设计模式总结 (3)创建内存型模式
(1) 原型(2)享元map里保存单个不重复的数据对象原创 2022-02-28 08:14:56 · 217 阅读 · 0 评论 -
设计模式总结 (2)创建型模式
(1)简单工厂(2)工厂(3)抽象工厂(4)外观(5)生成器Director的construct调用buildPart1, buildPart2, buildPart3原创 2022-02-26 15:09:19 · 265 阅读 · 0 评论 -
设计模式总结 (1)模式分类
模式序号是模式在《研磨设计模式》一书中的序号。模式模式创建型2.简单工厂Factory 有一个createApi函数,传入不同的type,创建和调用不同的类:ImplA或ImplB。3. 外观模式(多个子模块封装成一个模块)6. 工厂父类在不知道具体实现的情况下, 完成自身的功能调用; 而具体的实现延迟到子类来实现7. 抽象工厂产品族,类层次复杂eg.多种cpu,多种主板8.生成器生成文件:头,中间,尾。有两种方式生成:txt,xml创建原创 2022-02-26 15:03:29 · 508 阅读 · 0 评论 -
图解设计模式(1) Iterator 模式
实际问题:书架上有很多书,现在要迭代每本书。client端:最终模式为:原创 2020-09-18 09:07:29 · 172 阅读 · 0 评论 -
《研磨设计模式》chap25 访问者模式Visitor(3)联合组合模式+总结
1. 联合组合模式//抽象的组件对象,相当于访问者模式中的元素对象 public abstract class Component { //接受访问者的访问 public abstract void accept(Visitor visitor); //向组合对象中加入组件对象 public void addChild(Component child) { // 缺省的实现,抛出例外,因为叶子对象没有这个功能,或者子组件没有实现这个功能 throw new Unsupport原创 2021-03-27 11:37:51 · 235 阅读 · 0 评论 -
《研磨设计模式》chap25 访问者模式Visitor(2)模式应用到场景
1. 实现//各种客户的父类 public abstract class Customer { private String customerId;// 客户编号 private String name; //客户名称 ... get().set() public abstract void accept(Visitor visitor);}//企业客户public class EnterpriseCustomer extends Customer{ priv原创 2021-03-27 11:24:56 · 158 阅读 · 0 评论 -
《研磨设计模式》chap25 访问者模式Visitor(1)模式介绍
场景:给用户做服务,分为个人用户、企业用户,服务不断地变。1. 正常编码(不使用模式)public abstract class Customer { private String customerId; //客户编号 private String name;//客户名称 //客户提出服务请求的方法 public abstract void serviceRequest();}public class EnterpriseCustomer extends Cust原创 2021-03-27 10:44:24 · 174 阅读 · 3 评论 -
《研磨设计模式》chap24 桥接模式bridge(2)场景应用
1. 模式应用到场景中public abstract class AbstractMessage { //持有一个实现部分的对象 protected MessageImplementor impl; public AbstractMessage(MessageImplementor impl){ this.impl = impl; } public void sendMessage(String message,String toUser){ this.impl.send原创 2021-03-18 21:57:33 · 236 阅读 · 1 评论 -
《研磨设计模式》chap24 桥接模式bridge(1)基本概念
场景:现有“email“、“sms手机消息“两种发送消息方式,要加个是否“紧急消息“的类型区分,如何设计类?1. 正常编码(不使用模式)如果又要来个“特急“”类型,那类就更多了,这样肯定不好 2. 模式介绍实际上场景是一种二维目标的应用(编者语)。把x轴看成抽象类型,把y轴看成实现类型。public interface Implementor { /** * 示例方法,实现抽象部分需要的某些具体功能 */ public void operationImpl();}/原创 2021-03-18 21:49:30 · 197 阅读 · 0 评论 -
《研磨设计模式》chap23 职责链模式chainOfResponsibility(3)功能扩展+总结
1. 扩展功能链:某个链处理完继续向下传递。public class SaleModel { //销售的商品 private String goods; public String getGoods() { return goods; } public void setGoods(String goods) { this.goods = goods; } public String toString(){ return "商品名称="+goods+",销售数量="+原创 2021-03-30 00:05:13 · 177 阅读 · 0 评论 -
《研磨设计模式》chap23 职责链模式chainOfResponsibility(2)应用场景
1. 初步实现public abstract class Handler { //持有下一个处理请求的对象 protected Handler successor = null; //设置下一个处理请求的对象 public void setSuccessor(Handler successor){ this.successor = successor; } //处理聚餐费用的申请 public abstract String handleFeeRequest原创 2021-03-30 00:02:35 · 169 阅读 · 0 评论 -
《研磨设计模式》chap23 职责链模式chainOfResponsibility(1)模式简介
场景:申请经费,有好几个领导审批,项目经理、部门经理、总经理,最后总会有一个人回复审批结果。1. 正常编码public class FeeRequest { //提交聚餐费用申请给项目经理 public String requestToProjectManager(String user,double fee){ String str = ""; if(fee < 500){ //项目经理的权限比较小,只能在500以内 str = this.projectHandle(u原创 2021-03-29 23:58:21 · 205 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(4)AOP+总结
1. AOP面向方面编程共性功能AOP调用示意图public class SaleModel { private String goods; //销售的商品 public String getGoods() { return goods; } public void setGoods(String goods) { this.goods = goods; } public String toString(){ return "商品名称="+goods+",购买数原创 2021-03-30 09:04:03 · 151 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(3)I/O流
1.1public class IOTest { public static void main(String[] args)throws Exception { //流式读取文件 DataInputStream din = null; try{ din = new DataInputStream( new BufferedInputStream( new FileInputStream("IOTest.txt") ) ); //然后就可以获.原创 2021-03-30 08:56:20 · 170 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景
//计算奖金的组件接口 public abstract class Component { public abstract double calcPrize(String user,Date begin,Date end);}//基本的实现计算奖金的类,也是被装饰器装饰的对象 public class ConcreteComponent extends Component{ public double calcPrize(String user, Date begin, Date en..原创 2021-03-30 08:25:37 · 118 阅读 · 0 评论 -
《研磨设计模式》chap22 装饰模式Decorator(1)模式简介
场景:算员工奖金,各种奖金,有个人销售奖,团队奖,环比增加销售奖等等1. 正常编码public class Prize { //计算某人在某段时间内的奖金,有些参数在演示中并不会使用, public double calcPrize(String user,Date begin,Date end){ double prize = 0.0; //计算当月业务奖金,所有人都会计算 prize = this.monthPrize(user, begin, end);原创 2021-03-30 08:21:11 · 166 阅读 · 0 评论 -
《研磨设计模式》chap21 解释器模式Interpreter(2)parse模型
1. 定义读取表达式,构建抽象语法树,叶子类,节点类,context上下文step1:分解表达式,得到需要解析的元素名称和该元素对应的解析模型step2:根据节点的属性转换成为相应的解释器对象step3:组合抽象语法树,一定要按照先后顺序来组合,否则对象的包含关系就乱了 2.2.1 第1步:分解表达式 /** * 按照从左到右顺序来分解表达式,得到需要解析的元素名称, * 还有该元素对应的解析模型 * @param expr 需要分解的表达式 * @return 得到.原创 2021-03-15 22:44:23 · 183 阅读 · 0 评论 -
《研磨设计模式》chap21 解释器模式Interpreter(1)模式介绍
场景:读写xml文件,如果代码"写死了":谁是谁的child,万一文件父子节点改了,又要改代码。1. 正常编码(不使用模式)public class ReadAppXml { /** * 读取配置文件内容 * @param filePathName 配置文件的路径和文件名 * @throws Exception */ public void read(String filePathName)throws Exception{ Document doc = null; //建原创 2021-03-15 22:15:41 · 180 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (4)总结
1. 不共享的外部状态public class UnsharedConcreteFlyweight implements Flyweight{ //记录每个组合对象所包含的子组件 private List<Flyweight> list = new ArrayList<Flyweight>(); public void add(Flyweight f) { list.add(f); } public boolean match(String securityE原创 2021-03-14 10:07:01 · 152 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (3)重写应用场景
public interface Flyweight { //判断传入的安全实体和权限,是否和享元对象内部状态匹配 public boolean match(String securityEntity,String permit);}public class FlyweightFactory { private static FlyweightFactory factory = new FlyweightFactory(); private FlyweightFactory(){ }.原创 2021-03-14 10:03:48 · 117 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (2)模式介绍
1.享元模式的定义享元:分离出被缓存对象实例中,哪些数据是不变且重复出现的,哪些数据是经常变化的。(内部状态分离出来共享)对象的内部状态: 不变且重复出现的数据,对象的外部状态: 变化的数据运用共享技术有效地支持大量细粒度的对象,通过共享享元对象来减少对内存的占用。把外部状态分离出来,放到外部,让应用在使用的时候进行维护,并在需要的时候传递给享元对象使用。享元工厂:为了控制对内部状态的共享,并且让外部能简单地使用共享数据,提供一个工厂来管理享元。public interface Fl.原创 2021-03-14 10:00:48 · 142 阅读 · 0 评论 -
《研磨设计模式》chap20 享元模式 Flyweight (1)前奏介绍
场景:分配人员对各种数据表的权限,并验证权限操作。eg.1. 编码public class TestDB { //用来存放授权数据的值 public static Collection<String> colDB = new ArrayList<String>(); static{ //通过静态块来填充模拟的数据 colDB.add("张三,人员列表,查看"); colDB.add("李四,人员列表,查看"); colDB.add("李四,薪资原创 2021-03-14 09:49:28 · 188 阅读 · 0 评论 -
《研磨设计模式》chap19 备忘录模式
应用场景:需要保存对象的状态和值。1. 简介public interface Memento { }public class Originator { //表示原发器的状态 private String state = ""; public Memento createMemento() {//创建保存原发器对象的状态的备忘录对象 return new MementoImpl(state); } //重新设置原发器对象的状态,让其回到备忘录对象记录的状态 public原创 2021-03-13 10:28:56 · 219 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(4)例子
public class StateMachine { //持有一个状态对象 private State state = null; //包含流程处理需要的业务数据对象,不知道具体类型, 用Object,反正只是传递到具体的状态对象里面 private Object businessVO = null; //执行工作,客户端处理流程的接口方法。 public void doWork(){ //转调相应的状态对象真正完成功能处理 this.state.doWork(th..原创 2021-03-29 23:55:26 · 129 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(3)应用到场景
public interface VoteState { //处理状态对应的行为 public void vote(String user,String voteItem,VoteManager voteManager);}public class SpiteVoteState implements VoteState{ public void vote(String user, String voteItem, VoteManager voteManager) { //恶意投票 .原创 2021-03-29 23:53:10 · 102 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(2)模式介绍
1. 状态的平行性与策略模式的不同,策略模式的行为是平等的2. 上下文和状态处理对象上下文是持有状态的对象,但是上下文自身并不处理跟状态相关的行为,而是把处理状态的功能委托给了状态对应的状态处理类来处理。在具体的状态处理类中经常需要获取上下文自身的数据,甚至在必要的时候会回调上下文的方法,因此,通常将上下文自身当作一个参数传递给具体的状态处理类。客户端一般只和上下文交互。客户端可以用状态对象来配置一个上下文,一旦配置完毕,就不再需要和状态对象打交道了。客户端通常不负责运行期间状态的维护,也不负原创 2021-03-29 23:51:48 · 206 阅读 · 0 评论 -
《研磨设计模式》chap18 状态模式state(1)模式简介
场景:投票管理1. 正常编码//投票管理 public class VoteManager { //记录用户投票的结果,Map<String,String>对应Map<用户名称,投票的选项> private Map<String,String> mapVote = new HashMap<String,String>(); //记录用户投票次数,Map<String,Integer>对应Map<用户名称,投票的次数>原创 2021-03-29 23:48:48 · 267 阅读 · 0 评论 -
《研磨设计模式》chap17 策略模式(2) 总结
1. 新增加context 上下文:使用人民币支付和美元支付public interface PaymentStrategy { //公司给某人真正支付工资 public void pay(PaymentContext ctx);}public class RMBCash implements PaymentStrategy{ public void pay(PaymentContext ctx) { } }public class PaymentContext { //应被原创 2021-03-13 11:02:52 · 158 阅读 · 0 评论 -
《研磨设计模式》chap17 策略模式(1) 简介
客户报价,价格有多种情况。1. 正常思路解决:分成多个函数public class Price { //报价,对不同类型的,计算不同的价格 public double quote(double goodsPrice,String customerType){ if("普通客户".equals(customerType)){ return this.calcPriceForNormal(goodsPrice); }else if("老客户".equals(customerType)){原创 2021-03-13 10:48:42 · 177 阅读 · 0 评论 -
《研磨设计模式》chap16 模板方法模式
1. 定义把模板实现成为抽象类,为所有的子类提供了公共的功能,就是定义了具体的算法骨架;同时在模板中把需要由子类扩展的具体步骤的算法定义成为抽象方法,要求子类去实现这些方法,这就约束了子类的行为。eg. 总结起来,一个较为完整的模板定义示例,1.1 有两种人登录,一种是用户,一种是管理员,登录过程一样...原创 2021-03-13 12:19:08 · 166 阅读 · 0 评论 -
《研磨设计模式》chap15 组合模式(2)改写示例+总结
1. 改写示例在添加子组件的方法实现中,加入对父组件的引用实现。在删除子组件的方法实现中,加入把被删除的商品类别对象的父商品类别,设置成为被删除的商品类别的子类别的父商品类别的功能。实现新的返回组件的子组件对象的功能。 public class Composite extends Component{ public void addChild(Component child) { //延迟初始化 if (childComponents == null) { childComponents原创 2021-03-13 11:19:56 · 176 阅读 · 2 评论 -
《研磨设计模式》chap15 组合模式(1)简介
1. 应用场景介绍树:叶子public class Leaf { //叶子对象的名字 private String name = ""; public Leaf(String name){ this.name = name; }}public class Composite { //用来记录包含的其它组合对象 private Collection<Composite> childComposite = new ArrayList<Composite>原创 2021-03-13 11:12:12 · 190 阅读 · 0 评论 -
《研磨设计模式》chap14 迭代器模式(3) 举例
1. java的iteratorpublic class ArrayIteratorImpl implements Iterator{ //用来存放被迭代的数组 private PayModel[] pms = null; //用来记录当前迭代到的位置索引 private int index = 0; public ArrayIteratorImpl(SalaryManager aggregate){ Collection<PayModel> tempCol = new原创 2021-03-13 13:31:41 · 110 阅读 · 0 评论
分享