![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
设计模式
文章平均质量分 50
常用设计模式,用Java作为示例代码。
哈哈哈利波特
时光匆匆莫留悔
展开
-
设计模式之十七:访问者模式
在数据基础类里面有一个方法接受访问者,将自身引用传入访问者利用“双重分派”分派到实例内部,弥补Java多态中的方法重载时静态的,这一问题Java的方法重载是静态的:方法重载时,若参数有父类的,也有子类的,则按声明的类型调用,而不是实例的真正类型。eg. 对于重载的方法test(Father f)和test(Son s),若Father f = new Son();,调用test(f)则会以Father的类型传入。所以,用父类的引用无法代表子类的实例。但是this指针的类型是本类。事例需求:.原创 2022-03-25 21:11:06 · 1205 阅读 · 0 评论 -
设计模式之十六:命令模式
请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。把请求包装成命令。客户选择执行者,通过Command,让执行者执行命令。事例需求:软件的首页要展示商品列表,目前有“最热”和“最新”两个列表。但后期需要扩展。数据结构如图:接口及其代码如下:命令类:public interface Command { // 执行命令的方法 void execute();}public class HotComm.原创 2022-03-25 19:39:00 · 244 阅读 · 0 评论 -
设计模式之十五:观察者模式
对象件有一对多的关系。当一个对象被修改时,要自动通知依赖它的对象为了弱化对象之间的依赖事例需求:芒果没库存了,爱吃芒果的客户想要在芒果到货时收到短信通知数据结构如图:抽象类及其代码如下:观察者public abstract class Observer { public abstract void update();}public class CustomerObserver extends Observer { @Override public vo.原创 2022-03-25 18:06:20 · 288 阅读 · 0 评论 -
设计模式之十四:责任链模式
为请求创建了一个接收者对象的链,对请求的发送者和接收者进行解耦通常每个接收者都包含对另一个接收者的引用。如果一个对象不能处理该请求,那么它会把相同的请求传给下一个接收者,依此类推。事例需求:客户在支付订单时,可以享受多重优惠。数据结构如图:代码如下:public interface Discount { // 优惠后的实付金额。参数是优惠前的金额 float calculate(float payment);}public abstract class Multi.原创 2022-03-25 16:39:50 · 170 阅读 · 0 评论 -
设计模式之十三:策略模式
一个类的行为或其算法可以在运行时更改选择不同策略,来执行不同算法。通过注入对象,改变行为。此模式就是spring IOC思想事例需求:客户在支付订单之前,可以选择一种优惠策略。优惠有两种“满100减5”和“9折”数据结构如图:接口及其实现类代码如下:定义策略类,用实现类来实现具体策略public interface Discount { // 优惠后的实付金额。参数是优惠前的金额 float actualPayment(float payment);}publ.原创 2022-03-25 11:55:13 · 594 阅读 · 0 评论 -
设计模式之十二:模板方法模式
算法的流程、骨架在抽象类中已经固定,而将一些步骤延迟到子类中。使得子类可以不改变算法的结构即可重定义其中的某些特定步骤一个抽象类公开定义了执行它的方法的方式/模板。它的子类可以按需要重写方法实现,但调用将以抽象类中定义的方式进行事例客户买水果的流程:“提交订单->结算->支付”,而支付有三种方式:“线上、会员卡、现金”业务结构如图:抽象类及其实现类如下:public abstract class Shopping { // 模板方法是定义业务流程的,加final防止.原创 2022-03-25 10:50:19 · 385 阅读 · 0 评论 -
设计模式之十一:外观模式
隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口当访问流程复杂时,将系统融合成一个接口供外部使用,定义了系统的入口事例需求:客户下单了水果,需要经过“采摘->包装->送货”三个流程。若客户直接访问这三个流程,调用繁琐而且对外暴露了其他无用的成员。需要封装数据结构如图:接口及其实现类如下:public interface PickService { void pick(); // 实现类 class PickServiceImpl i.原创 2022-03-24 18:17:17 · 652 阅读 · 0 评论 -
设计模式之十:组合模式
把一组结构相似的对象,当做一个单一的对象。为减少数据类型,简化项目结构用于嵌套的树型数据结构,将其抽象成统一的数据结构事例需求:水果订单支持送货,需要建立一个收货地址的数据结构数据结构如图抽象类及实现类代码:public abstract class Node { private String addressName; private List<Node> mList; public Node(String addressName) { .原创 2022-03-24 17:06:00 · 377 阅读 · 0 评论 -
设计模式之九:代理模式
在访问一个对象时进行控制代理类作为A访问B的中间层(访问层),而不是A直接访问B事例需求:水果订单有本地仓库订单和第三方仓库订单两种,且第三方订单需要作访问控制数据结构如图接口及其实现类:public interface OrderService { void order();}// 本地仓库订单public class OrderServiceImpl implements OrderService { @Override public void orde.原创 2021-09-26 16:09:26 · 105 阅读 · 0 评论 -
设计模式之八:装饰器模式
向一个现有的对象添加新的功能,同时又不改变其结构用装饰类来包装原有的类(通过组合,而不是继承),提供额外的功能。事例需求:水果包装进行打包后,分别增加防伪、加固、加急的功能功能如图数据结构如图装饰类:装饰类要继承被装饰类Bag,这样才能代替被装饰类public abstract class BagDecorator implements Bag { protected Bag mBag; public BagDecorator(Bag bag) { .原创 2021-09-26 11:49:57 · 92 阅读 · 0 评论 -
设计模式之七:桥接模式
将抽象部分与实现部分分离,使它们都可以独立的变化将继承关系转换成组合关系事例需求:装水果的包装有两个维度的分类,大小和材质存在的问题:要创建所有种类的包装,需要有3*2=6个类。且每新增一个分类,类的数量就会乘积式增长种类的组合如图解决问题:从每个维度入手,以大小为主要维度用抽象类BagAbstraction表示,材质维度用接口Material表示BagAbstraction中持有Material对象即可结构如图:数据结构如下:只形成数据的抽象部分// 材质public .原创 2021-09-25 20:26:56 · 74 阅读 · 0 评论 -
设计模式之六:适配器模式
适配两个不兼容的接口将A接口转换成B接口事例需求:桔子包装用光了,想要用苹果包装来代替桔子包装。即AppleBag转换成OrangeBag结构如图目标类(桔子包装):public class OrangeBag implements Bag { @Override public void pack() { System.out.println("orange bag pack"); }}源类(苹果包装):public class Apple.原创 2021-09-25 16:43:09 · 83 阅读 · 0 评论 -
设计模式之五:单例模式
确保一个类只有一个实例private构造方法、用private static字段持有实例、用public static方法提供访问实例的入口分类饿汉式:饿怕了,所以先把饭做好懒汉式:懒惯了,所以在需要的时候再做饭饿汉式初级饿汉式类被加载时,就会创建实例。代码中第一次使用Singleton时,该类被加载public class Singleton { private static Singleton instance = new Singleton(); priva.原创 2021-09-18 19:00:24 · 79 阅读 · 0 评论 -
设计模式之四:建造者模式
建造者模式中,调用Builder来生产的是导演类Director产品宏观上复杂(产品之间的关系)=>工厂模式产品微观上复杂(产品内部结构)=>建造者模式原创 2021-09-18 16:51:32 · 69 阅读 · 0 评论 -
设计模式之三:抽象工厂模式
将多个工厂合并成一个,完成一系列多种实体的生产如果说一个实体接口代表一种实体那么简单工厂模式就是一种实体对应一个工厂,多种实体就需要多个工厂当不同种类的实体有对应关系时,就可以合并成一个工厂事例每种水果都有自己的包装实体关系如图:实体类public interface Bag {}public class AppleBag implements Bag {}public class OrangeBag implements Bag {}工厂类public inter.原创 2021-09-17 17:06:06 · 116 阅读 · 1 评论 -
设计模式之二:工厂方法模式
每个实体类都有自己的工厂事例项目结构如图:实体类public interface Fruit {}public class Apple implements Fruit {}public class Orange implements Fruit {}工厂类public interface FruitFactory { Fruit getFruit();}public class AppleFactory implements FruitFactory {原创 2021-09-17 16:11:21 · 64 阅读 · 0 评论 -
设计模式之一:简单工厂模式
也称“静态工厂模式”。不属于23中设计模式,但是所有工厂模式的基础就是一个静态工具类,用来创建一个接口下实现类的实例事例要生产的类public interface Fruit {}public class Apple implements Fruit {}public class Orange implements Fruit {}静态工厂类public class StaticFactory { public static final int TYPE_APPLE.原创 2021-09-17 15:43:17 · 65 阅读 · 0 评论 -
设计模式及其六大原则_简要
设计模式是解决问题的思想六大原则单一职责原则一个类只负责一项职责依赖倒置原则面向接口编程接口不变,实现类可以变开闭原则对扩展开放,对修改关闭在宏观的项目结构上,新功能不去修改已有的代码(也是面向对象的编程思想)里氏替换原则子类可扩展父类,但不要改变父类原有功能(即重写父类方法)接口隔离原则设计接口时功能尽量细粒度,最小功能单元这样添加业务时,多implements接口即可,而不是修改接口迪米特原则降低耦合局部变量不要引入新的类,否则类的结构上看不到该类,却要依赖该类名.原创 2021-09-16 18:07:00 · 166 阅读 · 0 评论