设计模式
梦想远航
既往不恋,纵情向前
展开
-
适配器设计模式
类适配器和对象适配器,对象适配器用的比较多在设计软件的场景中一般用不上,只要对已经运行良好的接口进行扩展的时候会用到。刘伟 设计模式讲到 有线程的快速排序算法和线程的二分搜索算法库(Adaptee),已经有定义好的班级成绩排序的接口(Target)。现在客户端(Client)需要将班级排序的接口实现,复用算法库提供的能力,但是接口的数据结构可能不兼容,比如成绩排序的入参是Long类型的,算...原创 2019-11-23 14:35:09 · 254 阅读 · 0 评论 -
命令模式-设计模式
请求发送者invoker命令 command请求接收者 receiver假设请求接受者这件没有共同特征,不能使用抽象层,就不能使用java多态实现,这时用command将invoker和receiver解耦。...原创 2019-11-12 10:10:39 · 243 阅读 · 0 评论 -
静态代理 动态代理 详解 附代码 动态代理和cglib
看的视频https://www.bilibili.com/video/av18092969?from=search&seid=10237606488800747275 张三要相亲,父母作为代理类帮张三打理相亲事宜。用到JDK的接口InvocationHandler和Proxy类。 代理类Parent实现InvocationHandler接口,先拿到被代理对象的引用,可以添加before...原创 2018-04-15 23:00:01 · 183 阅读 · 0 评论 -
设计一个输入流,该类的作用是在读文件的时候把文件中的大写字母转换为小写,小写转换为大写,数字不变
可以通过继承抽象装饰者类(FilterInputStream)实现一个装饰类,通过调用InputStream类或其子类提供的了一些方法再加上逻辑判断实现该功能。import java.io.*;/** * Created by Administrator on 2018/4/25 0025. */public class MyOwnInputStream extends Filt...原创 2018-04-25 07:50:03 · 1016 阅读 · 0 评论 -
单例模式总结 饿汉式 懒汉式 静态内部类 枚举 反射破坏单例 序列化 附代码
饿汉式 懒汉式单例模式参考博客 单例模式 饿汉式和懒汉式静态内部类实现单例模式参考博客 静态内部类 单例设计模式举例不管是饿汉式,还是懒汉式中的线程安全的双重检测机制和静态内部类实现单例模式,都会被反射破坏单例模式。利用反射得到私有构造方法,还是可以生成多个具体类,代码如下package com.company.反射与内省.单例设计模式改进;import java.io.Se...原创 2018-06-25 15:00:29 · 529 阅读 · 0 评论 -
建造者模式
建造者模式//// Source code recreated from a .class file by IntelliJ IDEA// (powered by Fernflower decompiler)//package lombok;import java.beans.ConstructorProperties;class User { private Stri...原创 2019-08-02 16:09:14 · 269 阅读 · 2 评论 -
详解代理模式和装饰模式
代理模式 代理角色在调用引用的真实主题操作之前或者之后还需要执行其他操作。如,婚姻中介,房屋中介。你比较忙,没有时间看房子,你只负责买房子这个动作,房屋中介在前期给你联系房源,后期给你准备合同。这里的你看房子的动作代理的角色是不会来干预和重写的。这里就和装饰模式不同了。 代理模式的代码public class Test { public static void main(St原创 2018-01-21 11:19:36 · 247 阅读 · 0 评论 -
cglib动态代理以及出错解决
动态代理的代码使用的是这篇博客http://blog.csdn.net/yakoo5/article/details/9099133/public class Test { public static void main(String[] args) { CglibProxy proxy = new CglibProxy(); //通过生成子类的方式创建代理类原创 2018-01-18 20:54:43 · 4239 阅读 · 0 评论 -
原型模式 深拷贝
发送邮件,邮件中有附件,深拷贝实现了附件也拷贝了一份。在附件中再加入了一个对象,序列化后也复制了,实验证明深拷贝会将引用对象的引用对象也都复制public class Test { public static void main(String[] args) { Email email = new Email(new Attachment()); Email原创 2018-01-18 14:30:55 · 349 阅读 · 0 评论 -
迭代器模式 附代码
参考这篇博客http://www.cnblogs.com/maowang1991/archive/2013/04/15/3023236.html 字符串数组集合,Collection中的iterator()方法返回自己定义的Iterator类,用到了工厂方法。迭代器模式将集合的存储和迭代分开,符合单一职责的原则。 代码如下public class Main { public static原创 2018-01-21 16:59:32 · 464 阅读 · 0 评论 -
策略模式详解 附代码
策略模式是由Context(环境类),抽象策略类(Strategy),具体策略类(ConcreteStrategy)组成,类图如下 在代码的例子中,有个ArrayHandle类,可以实现多种不同方法的排序,在该类中有一个抽象策略类的引用实例,用于定义采用的具体策略。抽象策略类就是Sort,是接口,里面有sort方法。具体的实现子类,写了冒泡排序和插入排序。这样在排序时,可以创新排序方法的实例,原创 2018-01-21 16:13:00 · 1207 阅读 · 1 评论 -
子类继承和覆盖父类的静态方法 解释了静态工厂方法不方便扩展
子类可以继承和覆盖父类的静态方法,但是如果在定义时用的是父类,即使实例化的是子类也无法方法覆盖后的静态方法。这样在用静态工厂方法的时候会导致无法像产品类一样提供抽象层,也无法通过具体类进行扩展。 静态方法是类方法,类不同,静态方法就不同了。下面代码运行结果是输出 super class。 如果都将static去掉,输出就是sub class。 如果只去掉某一个static,会报错,说明静态方法原创 2018-01-17 10:45:02 · 1169 阅读 · 0 评论 -
设计模式——工厂方法模式
关系图如下 2018-1-17更新,图中信息有误,第三个不是抽象工厂,是工厂方法模式。静态工厂方法也被称为简单工厂模式。 一、普通工厂模式: 有很多相同类型的实体类,如华为手机有很多的型号,他们有不同的生产线。不想在直接在代码中创建某个实体,交给工厂类去生产,我只要输入手机的型号。package 设计模式.工厂模式.简单工厂模式;/** * Created by Admini原创 2018-01-13 11:23:05 · 153 阅读 · 0 评论 -
抽象工厂模式
可以解决多个产品等级,如一个工厂可以生产电视机,空调。电视机可以有海尔,TCL品牌的,空调可以有海尔,TCL品牌的,他们形成了多个产品族。 现在有产品接口,电视机,空调。工厂接口,可以生产具体品牌的电视机和空调就形成了具体的工厂类。 如果只是工厂方法模式,就只能一个具体工厂生产一个产品。多个工厂形成多个产品族。不能形成多个产品等级。package 抽象工厂模式;/** * Created by原创 2018-01-17 16:07:02 · 197 阅读 · 0 评论 -
静态内部类 单例设计模式举例
单例设计模式可以用静态内部类实现,下面解释它的优点和原因。懒加载 创建方式是用内部静态类中的一个静态方法返回实例对象。在不使用的时候这个单例是不会存在的。这个就和懒汉式是一样的。线程安全 如果有多个线程同时创建实例,根据类加载的机制,多线程初始化一个类,JVM能保证只有一个线程执行初始化方法,其他线程进入阻塞状态。但是它能被反射来重复构造对象。从静态内部类能复习类初始化时的顺序,先父类静原创 2018-01-17 19:14:24 · 261 阅读 · 0 评论 -
单例模式 饿汉式和懒汉式
单例模式需要:构造方法私有化提供一个自身的私有静态成员变量提供一个公有的静态工厂方法一、饿汉式 在定义静态变量的时候就实例化单例类。 根据类加载机制,在加载,链接(验证,准备,解析)的阶段,单例类中的静态变量已经被分配了内存,并且设置了变量的初始化的值。这个在运行的时候只要初始化就行了,就比懒汉式节省时间了。 这是我个人的理解,因为我在运行如下实验代码的时候,如果不出现SingleTo原创 2018-01-17 20:05:19 · 185 阅读 · 0 评论 -
原型模式 浅拷贝
当需要创建大量相同或者相似的对象时,可以通过对一个已有对象的复制获取更多对象。浅拷贝 被复制对象的所有普通成员变量具有与原来对象相同的值,而所有对其他对象的引用仍然指向原来的对象。 在下面的示例代码中,email实例对象中有指向附件Attachment的实例对象,在浅拷贝中,这个附件对象是不会复制的。代码中会有== 和 equals的验证。2.浅拷贝步骤 在java中,可以通过覆盖Ob原创 2018-01-18 12:47:39 · 195 阅读 · 0 评论 -
对象序列化
序列化可以实现深拷贝 1. 深拷贝 复制对象将所有原对象引用的对象全部复制一份。注意是所有的引用对象,包括引用对象的引用对象都会复制一份的。这个在代码的实验中证明了。详见另一篇博客 设计模式——原型模式——深拷贝 在Attachment中加入了Cat对象,cat对象序列化后== 结果是false 将对象写入文件流或者字符流中代码public class Test {原创 2018-01-18 14:25:07 · 147 阅读 · 0 评论