设计模式
dengjili
一个人在党性、真诚、智慧三样东西中,只可能拥有两样
update by 2022/2/9
同时拥有党性、真诚、智慧,已经不是普通人
展开
-
适配器模式总结
新旧接口的转换,对外暴露的是新接口,实际运行的是旧实现三步口诀新增适配的类,实现新接口,也就是对外暴露的方法添加旧对象的引用,赋值给新增适配的类对外暴露的方法调用旧对象的方法例子import java.util.Enumeration;import java.util.Iterator;public class EnumerationAdapter<E> implements Iterator<E> { private Enumeration<E&原创 2020-06-12 13:55:15 · 262 阅读 · 0 评论 -
模板模式几种方式
抽象类模板模式execute方法定义了模板的执行逻辑,步骤2留给子类实现public abstract class ExampleTemplate { public void execute() { one(); two(); three(); } protected abstract void two(); private void one() { System.out.println("one"); } private void three() { Syst原创 2020-06-11 22:57:44 · 284 阅读 · 0 评论 -
工厂模式的思考
概述由于java具有封装、继承、多态的特性,我们都会对我们定义的对象进行封装,在使用这些对象之前,我们都会创建对象,也就是我们常用的new XXObject()方式。当我们是自己封装的对象,我们自己使用的时候是知道怎么创建这个对象的,因为这个对象实现者是我们自己,如下图所示,张三使用自己定义的对象,可以随意创建对象。当我们是多人合作的,张三还可能使用李四定义的对象,或者需要引入第三方Jar...原创 2020-04-30 17:15:02 · 204 阅读 · 0 评论 -
中介者模式 Mediator
中介者模式用一个中介对象来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互。如下图所示,使交流的双方都不互相依赖,都与中介者产生关系举一个具体的例子,如果没有中介,那么租客与房东只能一对一交流,需要先预约对方,交流不是很方便有中介参与后,房东和租客都与中介交流,关系变得简单一些实现采用中介者模式,类图关系Person依...原创 2019-11-15 16:23:29 · 206 阅读 · 0 评论 -
桥接模式 Bridge
桥接模式将抽象部分与实现部分分离,使它们都可以独立的变化。这个目的定义不是很好懂,我举个例子,假设我们有很多手机产商,如图所示,他们都是做手机的,对于某一个产商来说,同一个产商可以产很多不同功能的手机拆分,站在手机的角度,手机定义以下四点功能,那么我们可以简单的认为,如果你要成为一个手机产商,那么你就得支持以下功能系统cpu屏幕支持4G这里的支持功能,也就是所有手机都含有的...原创 2019-11-15 14:02:03 · 159 阅读 · 0 评论 -
原型模式 Prototype
原型模式原型模式为创建型模式,也就是是创建对象的模式,但是这个对象创建对象的方式为克隆clone方式原型模式例子被创建的对象public class Person implements Cloneable { private int id; private String name; public int getId() { return id; } public voi...原创 2019-11-15 10:49:12 · 95 阅读 · 0 评论 -
享元模式 Flyweight
享元模式尽可能多的共享对象,重用对象,简单的说就是如果对象不存在就创建它,如果对象存在,就重用它。关键词Share非享元模式例子我们先来看看一个例子,假设创建某个对象耗时较大,但是对象的实例数据有限。假设能创建的对象只有10个,但是创建对象都会耗时0.5秒,我们来看看输出20个对象耗时时间。对象封装public class Range { private int x; pub...原创 2019-11-14 22:56:42 · 113 阅读 · 0 评论 -
加载耗时资源代码实现
加载网络图片当图片没有加载好时,提示文字信息,加载完毕,显示图片模型设计蓝色为代理模式 橘红色为状态模式对应代码package headfirst.hd.proxy.eg;import java.awt.Graphics;import javax.swing.Icon;import javax.swing.JComponent;class...原创 2018-03-30 22:30:35 · 579 阅读 · 0 评论 -
代理模式-保护代理
案例场景,相亲网,本人不能对自己打分,只能修改自己的基本信息其他人只能对别人打分,不能修改别人的基本信息代码实现接口package headfirst.hd.proxy.eg2;public interface PersonBean { String getName(); String getGender(); String getIntere...原创 2018-03-31 11:50:40 · 1126 阅读 · 0 评论 -
模板方法应用-Arrays.sort(Object[] a)
不清楚模式方法模式可以参考:http://blog.csdn.net/dengjili/article/details/79631472Arrays.sort(Object[] a)定义public static void sort(Object[] a)根据元素的自然顺序对指定对象数组按升序进行排序。数组中的所有元素都必须实现 Comparable 接口。此外,数组中的所有元素都必须...原创 2018-03-21 21:35:50 · 1770 阅读 · 0 评论 -
组合模式
组合模式组合模式主要表现形式为树型结构,有一个整体和部分的关系,如我们平时使用的省份,县市,区县等下面我们来看一个例子这是一家餐厅的菜单结构,现在我们需要将其遍历输出 引入组合模式设计 对应代码基类代码package headfirst.hd.composite.eg;public abstract class Component { // 集...原创 2018-03-26 22:48:06 · 361 阅读 · 0 评论 -
多个Iterator的整合应用
迭代器模式Iterator入门:https://blog.csdn.net/dengjili/article/details/79666954多个Iterator顺序输出(先进先出)Iterator1:aIterator2:1,2Iterator3:x,y,z输出结果:a,1,2,x,y,z管理器package headfirst.hd.iterator.eg3...原创 2018-03-27 22:42:48 · 882 阅读 · 0 评论 -
状态模式入门
状态模式状态模式可以理解是策略者模式的特例,主要是用途上表现出特例策略者模式链接:https://blog.csdn.net/dengjili/article/details/79273928简单例子理解饮料自动贩卖机自动贩卖机状态图简化为以下几种状态 对应代码package headfirst.hd.state.eg;public class ...原创 2018-03-28 16:11:13 · 225 阅读 · 0 评论 -
拦截过滤器模式
过滤器拦截器的目的是想在做一些事前之前,处理一些动作,主要是思想,具体实现都是无所谓的设计思想拦截器可以采用链表或者数组实现,这里采用ListdoSomething这里采用静态代理,返回一个拦截器代理类,执行doSomething简单的代码实现原操作类public class Person { public void doSomeThing(String msg) { S...原创 2018-09-29 17:45:19 · 932 阅读 · 0 评论 -
责任链模式
责任链模式对于一个请求,可能有多个处理者,将处理着连接成一个链如部门里面有一个张三,张三要报销1500元交通费,根据公司规定,1500元属于部门经理审批,所有这个请求应该由部门经理处理实现思路采用链表方式模拟链具体代码申请人信息// 申请人信息public class Request { private String name; private float price...原创 2018-09-29 20:39:46 · 146 阅读 · 0 评论 -
访问者模式
想要为一个对象增强新的行为,且不封装具体的实现,那么就用访问者模式一般我们都是使用访问者模式增添遍历行为,这是一个误区。模型Element 表示要增强的行为,即accept方法elementA 代表原有对象visitor表示抽象接口visitorA表示具体的行为实现改进之前的例子组合模式中的列子:https://blog.csdn.net/dengjili/article/d...原创 2018-10-30 13:35:30 · 7202 阅读 · 2 评论 -
委托模式,简单工厂方法的演进
回顾简单工厂方法将factory类作为animal接口及其子类的容器,如果需要获取Animal,只需要从factory中获取即可。具体的代码实现接口和实现public interface Animal { void run();} public class Dog implements Animal{ @Override public void run() { Syst...原创 2018-11-03 15:15:58 · 498 阅读 · 0 评论 -
建造者模式,12306购票例子演进
目录购票流程例子改进,建造者模式方式bulider具体的代码实现引入fluent风格继续优化购票流程例子普通买票需要输入出发地,目的地,日期即可通过助手需要添加更多的信息模型抽象模拟三个场景具体的代码实现预计划订单public class PlanOrder { // 原搜索乘车日期 private Date date; // 出发地 private String...原创 2019-01-18 16:03:23 · 257 阅读 · 0 评论 -
桥连模式,模板模式的改进
模板模式的引进【第一版】中国人民银行发送短信例子,抽象发送的内容,发送短信的思路一致,内容不一样。抽象短信发送模板public abstract class AbstractSms { public void sendSms() { // 模拟参数传入 Map context = new HashMap<>(); context.put("name", "...原创 2019-04-13 15:59:37 · 228 阅读 · 0 评论 -
代理模式
代理案例一,RMI 搭建远程rmi例子rmi:https://blog.csdn.net/dengjili/article/details/79750093分析,客户端本地出现了服务端的代理对象 代理案例二,加载耗时资源代码实现对应链接:https://blog.csdn.net/dengjili/article/details/79764204代理案例三,保护...原创 2018-03-30 17:03:34 · 132 阅读 · 0 评论 -
模板方法模式
引入一个模板方法列子,我们经常写一些web工程,下面是我们常见的写代码的方式package servlet;import java.io.IOException;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServ...原创 2018-03-20 20:45:44 · 412 阅读 · 0 评论 -
设计模式之工厂模式
为什么需要工厂我们来看看,当没有工厂时引发的问题业务情景,当前有许多卖手机的店,里面卖着各种型号的手机,当前卖了苹果,三星,oppo,三款手机当前设计 对应代码IPhone package headfirst.hd.factory.phone;public class IPhone { public double price = 6000;}Sams...原创 2018-03-05 20:03:03 · 163 阅读 · 0 评论 -
Iterator接口与Enumeration接口双向兼容,适配器模式案例
适配者模式参考:http://blog.csdn.net/dengjili/article/details/79485034问题Enumeration是java中比较早提供的遍历稽核接口,Iterator是新的遍历接口,后来兼容原来旧的代码,需要使用到适配器Iterator方法Enumeration方法Iterator兼容Enumeration接口对象适...原创 2018-03-15 21:45:28 · 1125 阅读 · 0 评论 -
命令模式-headfirst例子改进
分析命令模式引入情景分析 现在我们有很多智能家居,他们都由同一个控制器控制,比如,能控制点灯,窗帘,电视等 每一个按钮(相当于命令)都对应一个电器的功能,列如点灯的开,电视的关等,如下 但是控制器1按钮,对应功能不一定是电视开功能,也可能是电灯开功能,或者其他,也就是说,我们的控制器按钮,可以绑定任意的具体电器功能,(这也是我们在设计模式中所追求的),所有我们修改一下设计,定义统...原创 2018-03-09 11:47:00 · 664 阅读 · 0 评论 -
适配者模式
生活中适配者例子1,这是我的电脑,网线接口和传统接口不一样,必须要通过一个转换器,转成usb接口,我的电脑才可以上网 例子2,现在我们的手机种类很多,对应着给手机充电需要对应的数据线 简答的适配者模式例子入门猩猩和人类很多相似的地方,但又不同于人类,随着有些猩猩经过训练,会变得越来越聪明,现在我们将猩猩适配为人类现给出例子,后给出解释动物接口packag...原创 2018-03-08 15:26:10 · 539 阅读 · 0 评论 -
Decorator装饰者模式
Decorator装饰者模式引入业务场景当前有一家饮料店,饮料包括基础饮料,购买饮料时候,可以选择需要提那家的配料,及饮料杯大小类型,然后结算金额。其中,饮料和配料可以会新增很多种,或原原料或配料因销售不佳可能下架,或饮料或者配料单价可以修改,(饮料大小类型不变,及没有其他类型)初级模型设计(不考虑饮料杯大小类型) 饮料为继承类,配料为变量对应代码Be...原创 2018-02-28 11:12:49 · 200 阅读 · 0 评论 -
继承与实现的决择,策略模式 strategy
继承引发的问题子类继承父类,主要目的是为了复用父类的方法代码结构对应相关代码Animalpackage headfirst.hd.strategy.base;public class Animal { //呼吸 public void breath() { System.out.println("我是动物,我用鼻子呼吸"); ...原创 2018-02-08 10:39:36 · 859 阅读 · 0 评论 -
确保类只有一个唯一对象,单件模式
为什么需要单件模式我们为什么要用到单件模式,当我们用到这些对象如:线程池,缓存,注册表和日志对象等,事实上,这些对象我们只能有一个实例,不然会导致很多问题出现,所以我们要将它弄成单件的。分析常用单件模式类图很简单 package headfirst.hd.singleton;public class Singleton { static Singleton ...原创 2018-03-07 11:48:51 · 544 阅读 · 0 评论 -
命令模式 undo,redo
命令模式入门例子:http://blog.csdn.net/dengjili/article/details/79495454为什么需要undo很多时候,我们再操作完,命令之后,我们发现,这个功能不是我们想要的,比如我们在文本编辑中,误删除了文本,我们希望通过回退操作,达到之前的状态。像之前的列子,我们打开了灯,但是之后发现,我们不需要开灯,我们也可以通过undo能撤销刚才的命令...原创 2018-03-12 21:45:31 · 2176 阅读 · 0 评论 -
模板方法-高级应用 hook(钩子)
模板方法模式入门:https://blog.csdn.net/dengjili/article/details/79631472修改设计加入hook,其中这个hook方法是可选的给出例子,再给出解释package headfirst.hd.template.eg;public abstract class AbstractClass { //不让子类覆盖掉...原创 2018-03-22 17:28:10 · 3231 阅读 · 0 评论 -
最少知识原则-headfirst
最少知识原则先看一段错误例子,这段代码耦合了多少类public float getTemp() { return station.getThermometer().getTemperature();}其中,station.getThermometer()返回时一个对象,然getTemperature()是前者返回对象的方法,这里属于耦合错误改进,实际上与上一致...原创 2018-03-20 16:30:07 · 643 阅读 · 0 评论 -
外观模式
外观模式:简化接口 我们通常在完成某一个流程操作时候,需要调用很多接口,我们可以对这些接口进行封装,提供一个简化接口未引入外观模式例子 早上出门,我们需要完成一些步骤对应代码package headfirst.hd.facade.eg.error;public class Eatable { public void eat() { S...原创 2018-03-20 15:56:00 · 131 阅读 · 0 评论 -
适配者模式应用:java转换流InputStreamReader和OutputStreamWriter类
适配者模式参考:http://blog.csdn.net/dengjili/article/details/79485034java中的IO流转换主要针对字节流向字符流的转换,字符流有行读写方法InputStreamReader对象适配器设计模式 重要说明InputStreamReader为适配器模式BufferedReader为装饰者模式具体例子代码文...原创 2018-03-20 11:59:04 · 1576 阅读 · 0 评论 -
命令模式的用途:日志请求的具体例子数据库回滚
命令模式 undo,redo参考:http://blog.csdn.net/dengjili/article/details/79533521 序列化与反序列化参考:http://blog.csdn.net/dengjili/article/details/79541333描述来自于headfirst某些应用需要将所有的动作都记录在日志中,并能在系统死机后,重新调用这些动作恢复到之前...原创 2018-03-13 21:43:16 · 872 阅读 · 0 评论 -
命令模式的用途:具体的例子多线程队列请求
命令模式参考:http://blog.csdn.net/dengjili/article/details/79495454描述来自于headfirst命令可以将运算块打包(一个接受者和一组动作),然后将它传来传去,就像是一般的对象一样。现在,即使在命令对象被创建许久之后,运算依然可以被调用。事实上,它甚至可以在不同的线程中被调用。我们可以利用这样的特性衍生一些应用,例如:日程安排、线程...原创 2018-03-13 20:48:30 · 1017 阅读 · 1 评论 -
迭代器模式Iterator
迭代器用途:遍历每一个含有的元素为什么需要迭代器由于数据结构导致了不同结构数据不一致,相应的操作也有差异 例如,数组遍历 int[] ints = {1, 2, 3}; if (ints != null) { for (int i = 0; i < ints.length; i++) { ...原创 2018-03-23 14:18:35 · 230 阅读 · 0 评论 -
依赖倒置原则定义,及倒置的两种理解
依赖倒置原则定义如下(可先不管) - 高层模块不应该依赖低层模块,两者都应该依赖抽象 - 抽象不应该依赖细节 - 细节应该依赖抽象情景描述 当前有一家饮料店,里面卖着很多饮料设计如下 问题描述这里箭头符号表示BeverageStore依赖Juice,及高层依赖于低层在BeverageStore中,对应的是具体的饮料实现,具体代码如下pa...原创 2018-03-06 11:33:28 · 4275 阅读 · 0 评论 -
超越模板方法模式,模板接口方式,来自于Gson例子
模板方法模式:https://blog.csdn.net/dengjili/article/details/79631472类ObjectNavigator/* * Copyright (C) 2008 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you ma...原创 2018-03-22 19:24:22 · 289 阅读 · 0 评论 -
观察者(Observer)模式
观察者(Observer)模式例子这里引入例子,当前有几个硬件设备,负责收集当前温度,湿度和气压,WeatherData对象从气象站收集数据,然后WeatherData向显示器发送数据,对应显示面板解析数据后显示(计算原始数据,输出日常所见的数据) 由于各种场合的需要,有的人只需要看到气象状况,有的人需要看到天气预报,所有根据需要显示不同信息,显示到不同的面板 初期设计 对应代码实现 D原创 2018-02-09 11:39:33 · 238 阅读 · 0 评论