设计模式
ErbaoLiu
学习 分享
展开
-
Java设计模式(十五)之访问者模式(Visitor)
本文以学校领导访问学生和教师为例介绍。被访问者首先抽象被访问者的“可被访问”特征,然后定义两个具体的被访问者“教师”和“学生”,如下:/** * Created by leboop on 2020/5/26. * 该接口对被访问者的“可访问性”进行抽象 */public interface IVisitable { /** * 表示接受访问者访问 * @param visitor 访问者 */ void accept(IVisitor...原创 2020-05-26 15:51:14 · 428 阅读 · 0 评论 -
Java设计模式(十四)之状态模式(State)
本文以十字路口红绿灯为例介绍。红绿灯有3个颜色,我们使用如下Color枚举类来表示:/** * Created by leboop on 2020/5/26. */public enum Color { RED, GREEN, YELLOW}红绿灯有三个状态:红灯状态,绿灯状态和黄灯状态,先抽象出三个状态的抽象类State,然后再分别定义三个具体的状态类RedState,GreenState,YellowState,分别如下:/** * Created by lebo...原创 2020-05-26 14:28:46 · 572 阅读 · 0 评论 -
Java设计模式(十三)之组合模式(Composite)
本文以磁盘杀毒为例介绍。先定义一个磁盘接口,如下:/** * Created by leboop on 2020/5/26. */public interface Disk { String name = ""; void add(Disk disk); void remove(Disk disk); void kill();}给磁盘杀毒的本质,是给磁盘下的每个目录杀毒,所以下面我们定义一个文件目录类,如下:/** * Created b...原创 2020-05-26 12:36:36 · 320 阅读 · 0 评论 -
Java设计模式(十二)之适配器模式(Adapter)
本文以JDK源码为基础介绍。FileInputStream,InputStreamReader,BufferedReader。原创 2020-05-26 10:42:34 · 326 阅读 · 0 评论 -
Java设计模式(十一)之装饰模式(Decorator)
本文以JDK中IO流源码为基础介绍。被装饰者/** * Created by leboop on 2020/5/25. */public abstract class MyInputStream { public abstract int read(String content);}MyInputStream是被装饰者超类,具备读取各种设备的数据功能。MyFileInputStream是MyInputStream的实现类,如下:/** * Created by l...原创 2020-05-25 18:19:05 · 401 阅读 · 0 评论 -
Java设计模式(十)之代理模式(Proxy)
目录静态代理动态代理cglib代理静态代理/** * Created by leboop on 2020/5/25. */public interface IStar { void sing(String songName);}/** * Created by leboop on 2020/5/25. */public class PopStar implements IStar { @Override public void sing(St原创 2020-05-25 16:45:01 · 420 阅读 · 0 评论 -
Java设计模式(九)之责任链模式(Chain)
目录Request和ResponseFilterFilterChainMain 在tomcat的catalina.jar和servlet-api.jar源码中使用了责任链模式,本文以该源码的简化版为例介绍。模拟客户端请求过滤处理和响应原理。Request和Response 先定义请求Request和Response实体类,如下:/** * Created by leboop on 2020/5/25. */public class Requ...原创 2020-05-25 13:17:12 · 1082 阅读 · 0 评论 -
Java设计模式(八)之观察者模式(Observer)
本文以JDK源码介绍。观察者Observerpublic interface Observer { void update(Observable o, Object arg);}被观察者Observablepublic class Observable { private boolean changed = false; private Vector<Observer> obs; public Observable() {...原创 2020-05-24 14:42:57 · 367 阅读 · 0 评论 -
Java设计模式(七)之迭代器模式(Iterator)
目录自定义ArrayList自定义LinkedList自定义Collection自定义Iterator和Iteratable Iterator模式在Java的集合框架中有使用。本文尽量使用源码解释Iterator模式。自定义ArrayList 我们先自定义MyArrayList类,如下:package main.design_pattern.iterator;import java.util.Arrays;/** * Created b...原创 2020-05-24 13:23:53 · 416 阅读 · 0 评论 -
Java设计模式(六)之模板模式(Template)
TemplateMethod是指在抽象类或者接口中定义一系列操作的框架,而将具体的操作交给子类来实现,使得子类可以在不改变框架的结构下可重定义框架的具体步骤细节。比如Runnable接口中的run方法就可以看成是一种模板方法,该方法定义了线程运行的框架,run中具体执行什么样的逻辑,交给子类来实现。下面以客户去银行办理业务为例介绍。客户去银行办理业务通常由如下几个步骤:(1)取号排队;(2)办理业务;(3)评价服务;/** * Created by leboop on...原创 2020-05-24 09:56:07 · 484 阅读 · 0 评论 -
Java设计模式(五)之建造者模式(Builder)
目录重叠构造器JavaBeansBuilder模式 建设现在有一个实际问题:使用一个类表示包装食品外面显示的各种营养标签。这些标签中有几个属性是必须:每份的含量和每份的卡路里。还有超过20个可选的属性:总脂肪量、钠含量、蛋白质含量等等。大多数产品在某几个可选的属性中会有非零的值。对于这样的类,如何构建呢?重叠构造器 如下我们使用很多个构造器实现了该类:/** * Created by leboop on 2020/5/24. */public ...原创 2020-05-24 09:14:56 · 393 阅读 · 0 评论 -
Java设计模式(四)之原型模式(Proto)
目录对象拷贝浅拷贝深拷贝原型模式对象拷贝 Person类定义如下:/** * Created by leboop on 2020/5/23. */public class Person { private String name; private Integer age; private City city; public Person(String name, Integer age, City city) { ...原创 2020-05-23 23:40:31 · 587 阅读 · 0 评论 -
Java设计模式(三)之策略模式(Strategy)
假设现在有一个实体类Person,代码如下:/** * Created by leboop on 2018/11/18. */public class Person { private String name; private Integer age; public Person(String name, Integer age) { this.name = name; this.age = age; }...原创 2020-05-23 21:42:07 · 418 阅读 · 0 评论 -
Java设计模式(二)之工厂模式(Factory)
目录简单工厂静态工厂抽象工厂简单工厂先创建两个类Car和Bike,看成是工厂要生成的两类产品,代码如下:/** * Created by leboop on 2020/5/23. */public interface Movable { void go();}/** * Created by leboop on 2020/5/23. */public class Car implements Movable{ @Override pub原创 2020-05-23 14:32:43 · 414 阅读 · 0 评论 -
Java设计模式(一)之单例模式(Singleton)
一、饿汉式(Eager Singleton)package main.singleton;/** * Created by leboop on 2018/11/27. * 声明为final,不可被继承 */public final class EagerSingleton { //定义实例对象时直接初始化 private static EagerSingleton...原创 2018-11-27 11:18:42 · 571 阅读 · 0 评论