设计模式之责任链模式
责任链模式责任链模式(Chain of Responsibility)使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链,并沿着这条链传递该请求,直到有对象能够处理它。
优点1、降低了对象之间的耦合度。该模式使得一个对象无须知道到底是哪一个对象处理其请求以及链的结构,发送者和接收者也无须拥有对方的明确信息2、增强了系统的可扩展性。可以根据需要增加新的请求处理类,满足开闭原则3、增强了给对象指派职责的灵活性。当工作流程发生变化,可以动态地改变链内的成员或者调动它们的次序,也可动态地新增或者删除责任4、责任链简化了对象之间的连接。每个对象只需保持一个指向其后继者的引用,不需保持其他所有处理者的引用,这避免了使用众多的 if 或者 if···else 语句5、责任分担。每个类只需要处理自己该处理的工作,不该处理的传递给下一个对象完成,明确各类的责任范围,符合类的单一职责原则
缺点1、不能保证每个请求一定被处理。由于一个请求没有明确的接收者,所以不能保证它一定会被处理,该请求可能一直传到链的末端都得不到处理2、对比较长的职责链,请求的处理可能涉及多个处 ...
设计模式之模版方法模式
模版方法模式在模板方法模式(Template Method)中,定义一个操作中的算法框架,将内容交给子类处理。使得子类可以不改变一个算法的结构即可重定义该算法的某些特定逻辑。
例子人拥有的时间是一样的,但是怎么安排是不一样的。
使用场景1、有多个子类共有的方法,且逻辑相同。2、重要的、复杂的方法,可以考虑作为模板方法。
优点
把不可改变的封装起来,把能够改变的扩展开来
他把很多类的共同操作给封装了起来,利于维护
缺点
每一个不同的实现都要交给不同的子类,导致个数增加,比较重量级。
代码1、抽象类(AbstractClass):实现了模板方法,定义了算法的骨架
12345678910111213141516171819202122232425262728293031323334353637383940414243444546package com.mode.templatemethod;/** * 日程 */public abstract class Schedule { /** * 早上 */ abstract void morning(); ...
设计模式之代理模式
代理模式代理模式(Proxy Pattern)为其他类提供代理控制对象访问,属于结构型模式,满足开闭原则。在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。
例子
买火车票不一定去火车站买也可以去代售点买
卖房子可以委托中介帮卖
电脑桌面创建快捷方式
分类代理模式分为静态代理,动态代理。静态代理:程序员自己写的代理类动态代理:分为Jdk和CJLB动态代理方式
静态代理使用代理方式在执行order前后增加日志纪录操作
123456package com.mode.proxy;public interface OrderService { public void order();}
123456789package com.mode.proxy;public class Order implements OrderService{ public void order(){ System.out.println("订单操作------->start"); System ...
设计模式之外观模式
外观模式外观模式(Facade Pattern)隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。
如果多个功能的计算或逻辑很复杂,并且相对独立,就可以通过外观模式来封装这些功能,简化底层操作方法,减少系统相互依赖,增加代码灵活性。
外观模式有一个致命的很大的缺点就是不符合开闭原则,如果要改东西很麻。
例子:去医院看病,可能要去挂号、门诊、划价、取药,让患者或患者家属觉得很复杂,如果有提供接待人员,只让接待人员来处理,就很方便。
1、假如一个方法里面有限流逻辑代码、权限逻辑代码、日志记录代码就会使项目变得耦合度高、复用性低、代码冗余。
12345678910111213141516171819package com.mode.facade;public class TestFacade { public static void main(String[] args) { System.out.println("<-------限流逻辑代码开始------->"); //此处1000行代码 ...
设计模式之适配器模式
适配器模式适配器模式(Adapter Pattern)是作为两个不兼容的接口之间的桥梁。
举个生活中的例子,我们生活用电是220v,而我们的手机、ipad这些电子产品充电肯定是不可能用这么大电压充电,所以手机充电线就有适配器传输转换合适的电压进行充电。
角色Target(目标抽象类):目标抽象类定义客户所需接口,可以是一个抽象类或接口,也可以是具体类。
Adapter(适配器类):适配器可以调用另一个接口,作为一个转换器,对Adaptee和Target进行适配,适配器类是适配器模式的核心,在对象适配器中,它通过继承Target并关联一个Adaptee对象使二者产生联系。
Adaptee(适配者类):适配者即被适配的角色,它定义了一个已经存在的接口,这个接口需要适配,适配者类一般是一个具体类,包含了客户希望使用的业务方法,在某些情况下可能没有适配者类的源代码。
示例1、我们有个接口需要传参Set集合类型2、客户端调用参数是List类型3、这时候我们通过适配器模式进行适配转换类型,达到复用。
适配者类Adaptee
1234567891011121314package com.mode.a ...
设计模式之装饰模式
装饰模式装饰模式(Decorator Pattern)是一种比较常见的模式,动态地给一个对象添加一些额外的职责。不改变原有对象动态扩展,可替代继承但是多层装饰会导致复杂化。
假设我们现在有个奶茶店,我们制作奶茶,假如客户需要加红豆、椰果则需要加钱。我们可以理解为是将奶茶进行扩展。
例如Mybatis中切换二三级缓存的时候就用的装饰模式,像spring配置多数据源有不同的数据库连接也可以使用装饰模式。
1、创建奶茶接口,里面有奶茶制作与对应金额方法
12345678package com.mode.decorator;public interface Milk { public void createMilk(); public int priceMilk();}
2、实现奶茶接口,一个是柠檬奶茶是17元,一个是芒果奶茶是22元。
12345678910111213141516171819package com.mode.decorator;/** * 柠檬奶茶制作 */public class LemonMilk implements Milk ...
设计模式之策略模式
策略模式:策略模式遵循开闭原则,实现对代码的解耦合。它是对算法的包装,可以自由选择算法。如果算法很多的话会有很多的策略类。在项目开发中会出现很多的if-else判断,而策略模式可以解决部分if判断。
if-else案例
1234567891011121314151617package com.mode.strategy;public class Test01 { public static void main(String[] args) { String type = "red"; if("red".equals(type)){ new RedCar(); }else if("bluer".equals(type)){ new BluerCar(); }else if("yellow".equals(type)){ ...