![](https://img-blog.csdnimg.cn/20201014180756913.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
java23种设计模式精讲
内功修为,必不可少
优惠券已抵扣
余额抵扣
还需支付
¥49.90
¥99.00
购买须知?
本专栏为图文内容,最终完结不会低于15篇文章。
订阅专栏,享有专栏所有文章阅读权限。
本专栏为虚拟商品,基于网络商品和虚拟商品的性质和特征,专栏一经购买无正当理由不予退款,不支持升级,敬请谅解。
没有女朋友的程序员
脑子不好使 记录使用过的东西 以及踩过的坑 归零学习 进军架构师 想要转行的同学可以多多关注
展开
-
面向对象的6大原则
指导思想: 可维护性(Maintainability):修改功能,需要改动的地方越少,可维护性就越好 可复用性(Reusability):代码可以被重复使用 写出自己总结的类库 可扩展性(Extensibility/Scalability):添加功能无需修改原来代码。 灵活性(flexibility/mobility/adaptability):代码接口可以灵活调用。 单一职责原则: 一个类别太大,别太累,负责单一的职责 高内聚,低耦合。 开闭原则: 对扩展开放,对修改关闭:尽量不修改原来的代码的情况下进行原创 2021-02-17 16:07:55 · 87 阅读 · 0 评论 -
Intepreter解释器
Intepreter解释器:解释脚本语言。 用的很少,知道即可。原创 2021-02-17 15:48:56 · 79 阅读 · 0 评论 -
设计模式列表
创建型: 1.Abstract Factory 抽象工厂 2.Builder 构建 3.Factory Method 工厂方法 4.Prototype 5.Singleton 单例 结构型: 1.Adapter 转换器 2.Bridge 桥接模式 3.Composite 组合模式 4.Decorator 装饰器模式 5.Facade 门面 6.Flyweight 享元 7.Proxy 代理 行为型: 1.Chain of Responsibility 责任链 2.Command 命令 3.Interpre原创 2021-02-17 15:45:42 · 81 阅读 · 0 评论 -
State状态模式
State状态模式:根据状态决定行为; public class MM{ String name; private enum MMState {HAPPY,SAD} public void simle(){ } public void cry(){ } public void say(){ } } 这样的话想添加转台就很麻烦了。 所以需要把状态抽取出来。 public abstract class MMstate{ abstract void smile(); abstract void cry(); ab原创 2021-02-17 15:39:15 · 91 阅读 · 0 评论 -
TemplateMethod模板方法
TemplateMethod模板方法:钩子函数。 凡是我们重写的方法,系统帮我们调用,都是模板方法。 例如: public class Main{ F f = new D(); f.m(); } abstract class F{ void m(){ uu(); hh(); } abstract void uu(); abstract void hh(); } calss D extends F{ @Override void uu(){ //TODO } @Override void hh(){ //TO原创 2021-02-17 15:17:30 · 70 阅读 · 0 评论 -
memento备忘录
memento备忘录:记录状态 便于回滚 存盘等。 使用的是序列化。 就是将数据序列化,存储在硬盘中。 类想序列化,必须实现标记型接口serializable 然后 使用ObjectOutputStream将对象写入硬盘中。 transient 不序列化该字段 例如:存盘 File f = new File(“path”); ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f)); oos.wirteObject(o原创 2021-02-17 15:06:38 · 87 阅读 · 0 评论 -
原型模式Prototype
原型模式Prototype: Object.clone();就是原型模式。 java中的原型模式: 实现原型模式需要实现标记型接口(这个借口没有任何方法)Cloneable 一般会重写clone()方法 如果只是重写clone()方法,而没有实现接口,调用时会报异常 一般用于一个对象的属性已经确定,需要产生很多相同对象的时候,需要区分深克隆和浅克隆。 object的clone方法是浅克隆,只是克隆当前对象,对于当前对象的字段不会克隆 ,而是引用,也就是说,克隆出来的对象和原来对象的字段其实使用的是同一个内存原创 2021-02-17 14:39:30 · 68 阅读 · 0 评论 -
Command模式
Command模式:封装命令。 撤回,或者上一步下一步都使用Command模式。原创 2021-02-17 13:01:57 · 125 阅读 · 0 评论 -
桥接模式Bridge
桥接模式Bridge:双维度扩展 public class GG{ public void chase(MM mm){ Gift g =new Book(); give(mm,g); } public void give(MM mm,Gift g){ } } public abstract class Gift{ } public class Book extends Gift{ } public class Flower extends Gift{ } poublic class MM{ } GG给MM送原创 2021-02-17 00:23:56 · 145 阅读 · 0 评论 -
Adapter转换器
Adapter转换器:接口转换器 最典型的就是: FileInputStream fis = new FileInputStream(""); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); 注意:KeyAdapter和WindowAdapter都不是转换器模式。 WindowAdapter存在的意义: 如果没有WindowAdapter: 那么 Frame f原创 2021-02-16 22:34:57 · 96 阅读 · 0 评论 -
构建器Builder
Builder :构建复杂对象的 例如: public class Person{ int id; String name; int age; int score; Location loc; private Person(){} public static class PersonBuilder{ Person p = new Person(); public PersonBuilder basicInfo(int id,String name,int age){ p.id = id; p.name=na原创 2021-02-16 22:00:21 · 71 阅读 · 0 评论 -
访问者模式Visitor
访问者模式:结构不变的前提:动态改变对于内部元素的动作.原创 2021-02-16 11:58:27 · 58 阅读 · 0 评论 -
迭代器Iterator
迭代器:容器与容器遍历。 容器:在物理层面上,存储结构只有两种,一种是连续位置存储就是数组 另一种是不连续存储就是链表 其他的任何数据结构底层都是由数组或者链表组成的。 实现自定义容器: 定义一个迭代器IteratorSelf public interface IteratorSelf implementsCollectionSelf{ boolean hasNext(); Obejct next(); } 自定义一个数组容器 class ArrayListSelf{ Object[] objects =原创 2021-02-15 22:45:04 · 89 阅读 · 0 评论 -
代理模式proxy
代理模式proxy:1.静态代理 2.动态代理 3.spring AOP 1.静态代理 public class Proxy implements Movable{ Movable m; public Proxy (Movable m){ this.m=m} public void move(){ System.out.println(“调用前要做的事情”); m.move(); System.out.println(“调用后要做的事情”) } } public interface Movable{ voi原创 2021-02-10 18:38:07 · 82 阅读 · 0 评论 -
享元模式
享元模式:重复利用对象,使用地方:字处理软件。 总结就是共享元对象。 String类就是享元模式。 例如: String s1=“a”; String s2=“a”; String s3=new String(“a”); String s4=new String(“a”); s1s2 true 在常量池中 s1s3 false 内存地址不一样 s3的地址跟常量池是不一样的。虽然s3也是使用常量池的地址。但是多了一层,所以不一样 s3 == s4 false 内存地址不一样 s3.intern() == s原创 2021-02-10 13:09:44 · 52 阅读 · 0 评论 -
组合模式Composite
组合模式:树状结构专用模式。 节点 abstract class Node{ public abstract void do(); } 叶子节点再无目录 class LeafNode extends Node{ String content public LeafNode(String content){ this.content=content; } publi void do(){} } 支几点相当于还有目录 class BranchNode extends Node{ List nodes = new原创 2021-02-10 12:54:09 · 61 阅读 · 0 评论 -
观察者模式observer
观察者Observer:事件处理模型 典型的是Listener使用的就是观察者模式。 观察者模式有三大对象,第一被观察者,第二观察者,第三事件 被观察者含有观察者的集合,并且传递事件给观察者, 观察者:接受事件,然后做出反应。 事件:要跟事件源绑定,事件源就是发起事件的对象。 如此,观察者、被观察者,事件,三者之间没有强耦合。 //被观察者 public class Observed{ List observers = new ArrayList(); { observers.add(new Observe原创 2021-02-10 12:44:36 · 150 阅读 · 0 评论 -
装饰器Decorator
装饰器:在原有的对象上加入新的元素。就是装饰一下。比如定义一个飞机类,想给飞机装饰一下,如何做,新建一个类,继承飞机,这么做可以,要是再装饰别的东西,再继承,如果前面两个都要的装饰,就要继承多个,java不能多继承,而且这样做不灵活,耦合度太高了。 可以使用聚合代替继承,这样耦合度降低了一个级别。 何为聚合? A类引用B类作为字段,这就是聚合。 举例: 普通的飞机 public class Plan{ public void paint(){ System.out.println(“普通”); } } 飞机原创 2021-02-09 23:52:07 · 113 阅读 · 0 评论 -
责任链模式 chainOfResponsibility
责任链是一些列的处理,将一系列的动作放在一个集合中,一个对象进来以后,要挨个执行,除非某个处理返回false。 最有代表的就是Filter和Interceptor.原创 2021-02-09 23:06:29 · 99 阅读 · 0 评论 -
facade 门面模式和mediator 调停者
一个项目创建很多类是很正常的,类与类之间的相互调用也很正常,尤其是老项目,类和类之间的引用错综复杂, 这个时候就可以使用门面模式,构建一个类,让个类管理其他所有类之间错综复杂的关系。 模块和模块之间或者组件和组件之间相互调用,错综复杂,这个时候可以使用调停者模式,让所有的系统都访问调停者,调停者会处理所有的请求,转发到别的模块或者系统上。 消息中间件就是用的这个模式,目的就是解耦。 ...原创 2021-02-02 00:03:39 · 148 阅读 · 0 评论 -
工厂系列-工厂方法以及抽象工厂
工厂系列-工厂方法以及抽象工厂 任何可以产生对象的方法或者类,都可以称之为工厂。 单例也是一种工厂 有人称之为静态工程。 为什么有了new,还需要有工厂?为了灵活控制生产过程,满足条件才能获得这个对象 交通工具:下雨天开车,不下雨骑自行车,赶时间的话就骑摩托 像这种灵活的方式的时候,就需要用到工厂模式。 车是一个类 自行车是一个类 摩托车是一个类 还需要一个接口,交通工具类,他们都实现这接口。 车: public class Car implements Moveable{ @Override public原创 2021-01-31 22:30:14 · 95 阅读 · 0 评论 -
策略-strategy
策略-strategy原创 2021-01-19 22:46:40 · 95 阅读 · 0 评论 -
单例-Singleton 多种写法
单例:保证在内存之中只有一个实例。 应用场景:整个项目中只需要有一个实例存在,即可使用单例。比如工具类,配置加载类等 一、饿汉式 1.如何保证内存中只有一个实例,将该类的构造器私有化。 例如:private Person(){} 2.其他类如何获取该实例 再类中提供静态方法,返回该实例。 private static final Person INSTANCE = new Person();//定义该实例 public static Person getInstance(){return person} /原创 2021-01-17 12:21:38 · 128 阅读 · 0 评论