Java设计模式
文章平均质量分 71
沙漠一只雕得儿得儿
沙漠一只雕,白月光与朱砂痣
展开
-
简单工厂模式和策略模式的区别
https://blog.csdn.net/lmx125254/article/details/86625960原创 2020-08-08 12:11:07 · 669 阅读 · 0 评论 -
行为型设计模式之--观察者模式
随着水果店做的时间变长,会有一些回头客,他们想要知道水果店定期的一些折扣信息,那么这些顾客就可以像订阅微信公众号一样来订阅水果店的折扣信息,当水果店有折扣时,通知这些订阅了消息的顾客即可。我们可以通过观察者模式实现上面的需求:首先我们的被订阅者,也就是消息的发布者,本例是水果店:抽象接口:public abstract class Attentions { //关注客户列表 protected List<Observer> observers = n原创 2020-07-12 18:18:02 · 257 阅读 · 0 评论 -
行为型设计模式之--命令行模式
随着水果店推出的商品种类的增加,会有不同的水果榜单推出,每一种榜单都对应着响应的查询接口,如图中,热门商品榜-->热门查询,最新商品榜-->最新商品查询,优惠商品榜-->优惠商品查询。这种方式它的依赖关系太强。命令模式:将不符合抽象编程的调用,改造成符合的抽象编程通过使用命令行模式,把直接请求的动作进行接口的包装,形成面向接口编程,进一步的完成解耦:完成后,它的行为模式就变成了如下:中间抽象出来了一层接口。对应的类图:首先原始的提供查询服务的三个类:/原创 2020-07-12 18:04:43 · 302 阅读 · 0 评论 -
行为型设计模式之--责任链模式
在上一节策略模式中,每个顾客可以选择不同的打折策略,但是通常有些顾客是符合多个打折策略的,那么如何将多个打折策略结合到一起使用呢?责任链模式提供了很好的解决方式:首先是多个折扣的抽象类:public abstract class MultyDiscount implements Discount { protected MultyDiscount nextMultyDiscount; public MultyDiscount(MultyDiscount ne原创 2020-07-12 17:36:32 · 195 阅读 · 0 评论 -
行为型设计模式之--策略模式
紧接着上面的模板方法设计模式,当用户支付时,其实用户是有优惠活动可以享受的,但是每个用户的具体情况不同,所选择的优惠活动是不一样的,有满减活动、首次购活动、新会员活动,等等一系列优惠。为了避免一系列的if ... else的书写,我们使用策略模式进行优化:首先是打折的抽象接口:public interface Discount { public int calculate(int money);}下面是四种不同的打折策略:/** * 满减 */public原创 2020-07-12 16:52:14 · 214 阅读 · 0 评论 -
行为型设计模式之--模板方法模式
模板方法实际就是封装固定的流程,像模板一样,第一步做什么,第二步又做什么,都在抽象类中定义好。子类可以有不同的算法实现,在算法框架不被修改的前提下实现某些步骤的算法替换。在软件开发中,有时会遇到类似的情况:某个方法的实现需要多个步骤,其中有些步骤是固定的;而有些步骤并不固定,存在可变性。为了提高代码的复用性和系统的灵活性,可以使用模板方法模式来应对这类情况。定义:定义一个操作中的算法框架,而将一些步骤延迟到子类中,使得子类不改变一个算法的结构即可重定义算法的某些特定步骤。在我们的水果店中,清点商品原创 2020-07-12 16:35:41 · 208 阅读 · 1 评论 -
结构型设计模式之--外观(门面)模式
客户下单后,最好的流程就是客户完全不去管这个水果是怎么采摘下来的,是怎么包装上去的,又是如何通过快递送货上门的;客户只负责下单,后面的这些服务内部的流程和逻辑完全不需要了解。下面就引出了外观模式(门面模式):客户只有一个下单的动作,这个动作会触发后面的一系列服务,首先我们的两个服务:采摘水果服务类、包装服务类:/** * 采摘服务 */public class PickService { /** * 采摘水果 */ public vo原创 2020-07-12 15:49:49 · 243 阅读 · 0 评论 -
结构型设计模式之--代理模式
随着水果店的不断发展,又来的新的业务场景需求,海外购的代理工作。如图,和Peter合作的第三方公司可以从海外代购一些水果,发送到客户手中,而客户是不关心这个水果具体是从越南还是印尼过来的,顾客只管向Peter的水果店下订单即可。这里Peter要做的就是转发这个订单请求到第三方公司去,而我们的Peter水果店就负责中转订单,它就是代理。具体类图:这里我们有一个OutOrderServiceImpl是海外购买服务,我们的顾客是无法直接访问到这个服务的,我们的顾客只能直接访问到水果店,通过水果店的原创 2020-07-12 15:26:32 · 129 阅读 · 0 评论 -
结构型设计模式之--装饰器模式
随着Peter水果生意越做越大,水果店根据客户的不同需求也添加了一些不同的服务,最原始的服务流程就是:水果采摘-->水果打包-->送货上门,就结束了。而现在由于不同客户有的需要加急处理,有的需要加固处理,有的需要认证这个水果的防伪标志,那么我们通过装饰器模式就可以很好地解决这些附加的需求业务。装饰器模式可以在不影响业务主流程的前提下,在打包环节增加防伪、加固、加急等功能不同的装饰加入到了打包流程中,增强了打包流程。上面的蓝色部分还是原来的打包Bag,添加的紫色部分就是装饰原创 2020-07-12 14:42:46 · 195 阅读 · 0 评论 -
结构型设计模式之--桥接模式
继续我们水果园的新业务,当水果成熟后我们采摘水果时需要将水果放入到不同的采摘袋中,采摘袋又分为不同的材质(纸/塑料/麻袋等十多种)和不同的型号(大/中/小/迷你)组合起来,共40多种采摘袋。这么多类型的采摘袋,我们如何对这些组合进行管理呢?细细想下,采摘袋的两个属性,一是大小,另一个是材质。我们可以将这两个属性进行剥离。我们将采摘袋的大小和材质进行了拆分,通过组合的方式,让这两个属性类产生关系,最终把材质组合进了采摘袋的对象中去。这个就是桥接模式的表达方式,把两个类型的东西接到一起。桥接模式原创 2020-07-12 12:02:10 · 233 阅读 · 0 评论 -
结构型设计模式之--适配器
前面三篇讲述了java设计模式中的创建类型,主要关注点在于类创建对象时有哪些模式可以参照,如:简单工厂、工厂方法、抽象工厂、单例、建造者模式这几种比较优雅的类创建出对象的设计模式。下面我们将关注点放在如何处理类与类之间的关系上,让类与类之间的结构、以及协作处理变得更加的优雅。在java中,让类与类之间发生关系有两种方式:一是继承,另一个是组合。结构型设计模式关注焦点在于这两种方式中,倾向于组合,会优先通过组合的方式,让类之间产生关系;而少使用继承。下面看下这两种关系:图中的target类原创 2020-07-12 11:15:34 · 177 阅读 · 0 评论 -
创建型设计模式之--建造者模式
建造者模式也被称为生成器模式,它是创建一个复杂对象的创建型模式,其将构建复杂对象的过程和它的部件解耦,使得构建过程和部件的表示分离开来。我们接着用工厂模式中的果园举例,我们的水果店为了吸引老顾客、以及新顾客办理会员,推出了各式各样的促销活动,例如会员购买苹果、香蕉、桔子可以减15元;假日促销活动可以立减10元的活动;如图,目前我们推出了两种活动套餐上面一条流程可以抽象为如下步骤:首先设定苹果礼盒价钱-->设置香蕉礼盒价钱-->设置桔子礼盒价钱-->设置折扣价钱,最终我们拿到了水原创 2020-07-05 22:45:19 · 234 阅读 · 0 评论 -
创建型设计模式之--单例模式
单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。注意:1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。介绍意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。原创 2020-07-05 21:39:02 · 270 阅读 · 0 评论 -
创建型设计模式之--简单工厂、工厂方法、抽象工厂模式
我们举一个摘水果的例子,果园中种着苹果树、香蕉树、桔子树等等果树,当有三个小伙伴想要吃苹果时,他们就需要各自去拿各自想要吃的水果,我们最原始朴素的写法如下,谁需要谁就自己去拿就好了:/** * 不使用设计模式:最原始的想法,哪里用就直接在哪里new出来相应的对象 */public class PeterClient { //Peter自己吃水果 public static void main(String[] args) { peterdo();原创 2020-07-05 21:18:58 · 633 阅读 · 0 评论 -
项目架构演变--从门面模式到代理模式
我们使用项目演进的方式来看看怎么从最开始原始的代码书写,这种方式代码严重耦合,没有复用性可言,如果我们想加一些统一的请求参数需要在每个地方都修改一遍,工作量是巨大的。那么我们自然就想到了如何在此基础上进行一定的封装,让用到的地方进行统一的请求,而不用重复的代码书写多遍。再到后面我们有更多的切换网络库的需求的话,是如何使用代理模式做到可以随意切换网络库。这三个层次,来看看较好的写法的演进过程。为了简...原创 2020-01-04 16:27:01 · 432 阅读 · 0 评论 -
搞懂装饰器模式
装饰模式是结构型设计模式之一,其在不必改变类文件和使用继承的情况下,动态地扩展一个对象的 功能,是继承的替代方案之一。它通过创建一个包装对象,也就是装饰来包裹真实的对象。定义:动态地给一个对象添加一些额外的职责,就增加功能来说,装饰模式比生成子类更为灵活。 装饰模式的结构图如图所示在装饰模式中有如下角色。Component:抽象组件,可以是接口或是抽象类,被装饰的最原始的对象...原创 2019-12-28 19:21:59 · 423 阅读 · 0 评论 -
搞懂静态代理和动态代理
代理模式也被称为委托模式,它是结构型设计模式的一种。在现实生活中我们用到类似代理模式的场 景有很多,比如代理上网、打官司等。 定义:为其他对象提供一种代理以控制对这个对象的访问。 代理模式的结构图如图所示:代理是什么?代理也称“委托”,分为静态代理和动态代理,代理模式也是常用的设计模式之一,具有方法增强、高扩展性的设计优势。其设计就是限制直接访问真实对象,而是访问该对象的代理类。这样的...原创 2019-12-28 16:21:13 · 571 阅读 · 0 评论 -
回调使用实例
mainActivity.java 和 SettingRecyclerAdapter.java 这两个类需要根据从服务端获取到的APK的版本信息去判断是否需要弹出更新的对话框,也就是需要从服务器获取到版本信息后才能进行后续的版本判断、弹出升级对话框的操作。有一个明显的先后顺序:从服务端返回的信息之后本地判断完成后再进行后续操作。mainActivity.java//应用初始化的OnC...原创 2019-01-02 14:41:05 · 330 阅读 · 0 评论 -
EventBus封装实战
eventBus使用:https://www.jianshu.com/p/a040955194fceventBus封装:https://www.jianshu.com/p/e00297348f17EventBus封装实战:https://github.com/buder-cp/DesignPattern/tree/master/EventBusExample-master/EventBus...原创 2019-11-28 14:40:06 · 514 阅读 · 0 评论 -
策略模式项目中实际使用
FusionCheck和CommonCheck是ILiveCheck的实现类,当我们需要使用这两个实现类的时候,使用LiveCheckWrapper里面传入相应的需要的实现类即可。具体的代码结构如下图所示:仿写的代码如下:一个抽象策略接口:public interface Strategy { int doOperation(int num1, int n...原创 2019-11-27 20:49:18 · 445 阅读 · 0 评论 -
策略模式实战篇
我们使用 MVP + 策略模式模拟一个简单的登录功能MVP + retorfit + rx 请求策略简单的 UML首先我们要使用 AsyncHttpClient、Retorfit 等,先添加配置 Gradle「项目 Module 的 build.grade中」compile 'com.squareup.retrofit2:retrofit:2.3.0'compile 'io.r...转载 2019-11-05 19:48:46 · 661 阅读 · 0 评论 -
观察者模式实践
这个模式的定义:定义对象间的一种一对多的依赖关系,当一个对象的状态发送改变时,所有依赖于它的对象都能得到通知并被自动更新使用场景如下:有一种短信服务,比如天气预报服务,一旦你订阅该服务,你只需按月付费,付完费后,每天一旦有天气信息更新,它就会及时向你发送最新的天气信息。 杂志的订阅,你只需向邮局订阅杂志,缴纳一定的费用,当有新的杂志时,邮局会自动将杂志送至你预留的地址。观察上面两...原创 2019-03-13 20:22:33 · 280 阅读 · 0 评论 -
一眼就会的建造者模式Builder
1.构造一个普通的bean:public class Person { private String name; private int age; private double height; private double weight; public String getName() { return name; } ...原创 2019-03-13 16:32:47 · 151 阅读 · 0 评论 -
策略模式原理篇
当我们写代码时总会遇到一种情况,就是我们会有很多的选择,由此衍生出很多的if…else,或者case。如果每个条件语句中包含了一个简单的逻辑,那还比较容易处理;但如果在一个条件语句中又包含了多个条件语句,就会使得代码变得臃肿,维护的成本也会加大,这显然违背了开放封闭原则。策略模式定义:策略是对算法的封装,是一种形为模式,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换...原创 2019-03-13 21:09:32 · 482 阅读 · 0 评论