
设计模式
拾荒路上的开拓者
可能出错的地方,一定会出错
展开
-
设计模式——命令模式
命令模式(Command Pattern)是一种数据驱动的设计模式,它属于行为型模式。请求以命令的形式包裹在对象中,并传给调用对象。调用对象寻找可以处理该命令的合适的对象,并把该命令传给相应的对象,该对象执行命令。以某电商首页为例子,分为了首页模块、执行模块如果首页模块ListView直接请求执行模块handler,而会产生强偶合;handler一旦有改动,则会需要改动ListVi...原创 2020-02-06 16:46:29 · 190 阅读 · 0 评论 -
设计模式——观察者模式
当对象间存在一对多关系时,则使用观察者模式(Observer Pattern)。比如,当一个对象被修改时,则会自动通知它的依赖对象。观察者模式属于行为型模式。按照观察者模式,建立如下模型://创建观察者public interface Observer { void update();}public class CustomerObserver implements...原创 2020-02-06 15:39:22 · 240 阅读 · 0 评论 -
设计模式——责任链模式
与上一篇策略模式的需求不同,此时的需求为优惠券可多张叠加,如下图此时如果再采用策略模式则不太适用了,可使用责任链模式满足需求。如下图将多种优惠使用链串起来,前后生产调用的依赖关系责任链模式下将请求传给一个接收者链,由链将请求流转给目标对象。Calculate方法内,判断next结点不为null,则继续调用next.calculate(); 客户端调用时,...原创 2020-02-06 12:40:40 · 246 阅读 · 0 评论 -
设计模式——策略模式
以网上购物一下单为例子,网店很多时候为促销,往往会推出一些优惠活动,如满200减100、首次购头20等。面对这种需求,可通过选择策略类,来执行不同算法分支。核心是通过注入对象,改变行为。将每一种优惠策略,单独成一个组件对象,独立出来 使用方通过选择不同的组件,达到不同的行为PS: 此模式其实就是spring IOC思想//建立优惠类接口public in...原创 2020-02-06 11:38:42 · 257 阅读 · 2 评论 -
设计模式——模板方法模式
以店面销售为例子,随着店面的发展以及顾客的多元化需求,未来的支付方式会越来越多,而且存在着未知的支付方式,这给系统开发带来了一定的难度。因此,此处可以引入模板方法模式,在父类中编排主流程,将步骤实现延迟到子类去实现。如上图,将支付方式延迟到子类去完成。按照模板方法模式,规则代码框架图:先将主流程框架逻辑(清点商品/计算价目/结算/送货上门)设计完成 再实现各模块小步骤 ...原创 2020-02-06 10:10:09 · 402 阅读 · 0 评论 -
设计模式——外观模式
以下单摘果为案例,客户下单后产生了一系列的动作:采摘 -> 商品包装 -> 物流送货根据上图流程,每下一个订单都需要经过三个步骤,如果每一个订单都需要关注三个组件服务的使用细节,那会使用的风险。因此需要糅合功能,对外只提供一个入口。调用方只关注facade组件,不需要知道底层服务; 隐藏掉底层服务中不想干的功能代码逻辑如下://分别新建采摘、打包、快递...原创 2020-02-06 09:04:45 · 191 阅读 · 0 评论 -
设计模式——组合模式
以行政区为例子:由于不同地区存在着上下级关系,且会拥有多平级组合,如果采用每个组合主一个类,这样需要创建的类特别多,此时可使用组合模式,如下图:上图左边可转为右边的递归关系,其原理是把一组相似的对象当作一个单一的对象,为的是减少数据类型//建立Node接口public abstract class Node { private String n...原创 2020-02-05 22:19:58 · 209 阅读 · 0 评论 -
设计模式——代理模式
一个类代表另一个类的功能,以委托第三方公司代售为例子//定义订单服务接口public interface OrderService { int saveOrder();}//本地服务public class OrderServiceImpl implements OrderService { @Override public int saveOrde...原创 2020-02-05 22:16:42 · 187 阅读 · 0 评论 -
设计模式——装饰者模式
以销售水果为例,在不影响业务主流程的前提下,在打包环节中增加防伪/加固/加急等功能。动态地给一个对象增加一些额外的职责,为的是功能增强//定义包装public interface Bag { void pack();}public class AppleBag implements Bag { @Override public void pac...原创 2020-02-05 22:14:49 · 158 阅读 · 0 评论 -
设计模式——桥接模式
使用采摘袋的方式来表达桥接模式采摘袋有两个属性:大小与材质 取舍采摘袋的主要属性,是大小;附属属性是材质 剥离掉附属属性材质,放入一个扩展实体中去将两个维度变化的功能组合起来,为的是独立变化以下为代码:使用采摘袋的方式来表达桥接模式采摘袋有两个属性:大小与材质取舍采摘袋的主要属性,是大小;附属属性是材质剥离掉附属属性材质,放入一个扩展实体中去将两个维...原创 2020-02-05 22:12:15 · 184 阅读 · 0 评论 -
设计模式——适配器模式
如下场景:用法:OrangeBagAdpter继承OrangeBag的功能,同时组合AppleBag对象,使用OrangeBag与AppleBag产生关联。 当OrangeBag目标方法被用时,OrangeBagAdpter转调AppleBag的对象方法PS: OrangeBag和AppleBag都是系统已有的类。//产品public interface F...原创 2020-02-05 22:06:51 · 158 阅读 · 1 评论 -
设计模式——单例模式
该单例模式为懒汉式模式,注意点为需要加双重校验锁,避免出现多线程同时调用时创建了多个实例。public class Session { private static Session session; public static Session getInstance() { if (session == null) { synch...原创 2020-02-05 22:04:13 · 175 阅读 · 0 评论 -
设计模式——建造者模式
当需要多种变化组合时,多种商品组合在一起,同时针对节假日、老客户有不同的优惠;面对这种需求,如果使用工厂模式可能出现模式较死板,不能灵活应对各种组合,此时可以考虑使用建造者模式。//商品种类public interface Fruit { int getPrice(); void setPrice(int price);}public class Apple imp...原创 2020-02-05 22:03:41 · 153 阅读 · 0 评论 -
设计模式——抽象工厂模式
抽象工厂模式是工厂方法模式的一个扩展,当每类产品都需要同一类附加功能时,把附加功能合并为一个抽象类工厂。//定义水果产品public interface Fruit { void draw();}public class Apple implements Fruit { @Override public void draw() { Syste...原创 2020-02-05 22:02:51 · 137 阅读 · 0 评论 -
设计模式——工厂方法模式
//定义产品public interface Fruit { void draw();}public class Apple implements Fruit { @Override public void draw() { System.out.println("我是苹果"); }}public class Orange impleme...原创 2020-02-05 22:01:45 · 167 阅读 · 0 评论 -
设计模式——简单工厂模式
//定义产品public interface Fruit { void draw();} public class Apple implements Fruit { @Override public void draw() { System.out.println("我是苹果"); }} public class Orange imp...原创 2020-02-05 22:00:34 · 131 阅读 · 0 评论