observerUser1 = new ObserverUser1(objectFor3D);

observerUser2 = new ObserverUser2(objectFor3D);

// 两个观察者,发送两条信息

objectFor3D.setMsg(“201610121 的 3D 号为:127”);

objectFor3D.setMsg(“20161022 的 3D 号为:000”);

2. 工厂模式

简单列一下这个模式的家族:

  • 1、静态工厂模式

  • 这个最常见了,项目中的辅助类,TextUtil.isEmpty 等,类+静态方法。

  • 2、简单工厂模式(店里买肉夹馍)

  • 定义:通过专门定义一个类来负责创建其他类的实例,被创建的实例通常都具有共同的父类。

  • 根据类型直接创建肉夹馍:SimpleRoujiaMoFactory.java

public RoujiaMo creatRoujiaMo(String type) {

RoujiaMo roujiaMo = null;

switch (type) {

case “Suan”:

roujiaMo = new ZSuanRoujiaMo();

break;

case “La”:

roujiaMo = new ZLaRoujiaMo();

break;

case “Tian”:

roujiaMo = new ZTianRoujiaMo();

break;

default:// 默认为酸肉夹馍

roujiaMo = new ZSuanRoujiaMo();

break;

}

return roujiaMo;

}

  • 3、工厂方法模式(开分店)

  • 定义:定义一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法模式把类实例化的过程推迟到子类。

  • 对比定义:

  • 1、定义了创建对象的一个接口:public abstract RouJiaMo sellRoujiaMo(String type);

  • 2、由子类决定实例化的类,可以看到我们的馍是子类生成的。

  • 提供创建肉夹馍店抽象方法:RoujiaMoStore.java

public abstract RoujiaMo sellRoujiaMo(String type);

  • 具体实现抽象方法:XianRoujiaMoStore.java

  • 分店依旧使用简单工厂模式:XianSimpleRoujiaMoFactory.java

  • 4、抽象工厂模式(使用官方提供的原料)

  • 定义:提供一个接口,用于创建相关的或依赖对象的家族,而不需要明确指定具体类。

  • 对比定义:

  • 1、提供一个接口:public interface RouJiaMoYLFactroy

  • 2、用于创建相关的或依赖对象的家族 public Meat createMeat();public YuanLiao createYuanliao();我们接口用于创建一系列的原材料。

  • 创建用于提供原料的接口工厂:RoujiaMoYLFactory.java

  • 各自分店实现接口,完成原料提供:XianRoujiaMoYLFoctory.java

  • 准备时,使用官方的原料:RoujiaMo.java

```java /**

Meet meet = roujiaMoYLFactory.creatMeet();

YuanLiao yuanLiao = roujiaMoYLFactory.creatYuanLiao();

Log.e("—RoujiaMo:", “使用官方的原料 —” + name + “: 揉面-剁肉-完成准备工作 yuanLiao:”+meet+“yuanLiao:”+yuanLiao);

} ```

3. 单例设计模式

单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误,而使用单例模式能够保证整个应用中有且只有一个实例

  • 定义:只需要三步就可以保证对象的唯一性

  • (1) 不允许其他程序用 new 对象

  • (2) 在该类中创建对象

  • (3) 对外提供一个可以让其他程序获取该对象的方法

  • 对比定义:

  • (1) 私有化该类的构造函数

  • (2) 通过 new 在本类中创建一个本类对象

  • (3) 定义一个公有的方法,将在该类中所创建的对象返回

  • 饿汉式[可用]:SingletonEHan.java

  • 含懒汉式[双重校验锁 推荐用]:SingletonLanHan.java

```java private SingletonLanHan() {} private static SingletonLanHan singletonLanHanFour; public static SingletonLanHan getSingletonLanHanFour() {

if (singletonLanHanFour == null) {

synchronized (SingletonLanHan.class) {

if (singletonLanHanFour == null) {

singletonLanHanFour = new SingletonLanHan();

}

}

}

return singletonLanHanFour;

}

  • 内部类[推荐用]:SingletonIn.java

  • 枚举[推荐用]:SingletonEnum.java

4. 策略模式

策略模式:定义了算法族,分别封装起来,让它们之间可相互替换,此模式让算法的变化独立于使用算法的客户。

  • 以创建游戏角色为例子:

  • 最初的游戏角色的父类:Role.java

  • 发现有重复代码后,重构后的父类:Role.java

  • 总结:

  • 1、封装变化(把可能变化的代码封装起来)

  • 2、多用组合,少用继承(我们使用组合的方式,为客户设置了算法)

  • 3、针对接口编程,不针对实现(对于 Role 类的设计完全的针对角色,和技能的实现没有关系)

  • 最后测试:创建角色:

RoleA roleA = new RoleA("—A");

roleA.setiDisplayBehavior(new DisplayYZ())

.setiAttackBehavior(new AttackXL())

.setiDefendBehavior(new DefendTMS())

.setiRunBehavior(new RunJCTQ());

roleA.display();// 样子

roleA.attack();// 攻击

roleA.run();// 逃跑

roleA.defend();// 防御

5. 适配器模式

定义:将一个类的接口转换成客户期望的另一个接口,适配器让原本接口不兼容的类可以相互合作。这个定义还好,说适配器的功能就是把一个接口转成另一个接口。

  • 以充电器为实例: 手机充电器一般都是 5V 左右吧,咱天朝的家用交流电压 220V,所以手机充电需要一个适配器(降压器)

  • 一部手机: Mobile.java

  • 手机依赖一个提供 5V 电压的接口: V5Power.java

  • 我们拥有的是 220V 家用交流电: V220Power.java

  • 适配器,完成 220V 转 5V 的作用:V5PowerAdapter.java

  • 最后测试:给手机冲个电:

Mobile mobile = new Mobile();

V5Power v5Power = new V5PowerAdapter(new V200Power());

mobile.inputPower(v5Power);

6. 命令模式

定义:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。(简化: 将请求封装成对象,将动作请求者和动作执行者解耦。)

  • 需求:最近智能家电很火热,假设现在有电视、电脑、电灯等家电,现在需要你做个遥控器控制所有家电的开关,要求做到每个按钮对应的功能供用户个性化,对于新买入家电要有非常强的扩展性。

  • 1、家电的 API:Door.java

  • 2、把命令封装成类:

  • 统一的命令接口:Command.java

  • 家电实现该接口:DoorOpenCommand.java

  • 3、遥控器:ControlPanel.java

  • 4、定义一个命令,可以干一系列的事情:QuickCommand.java

QuickCommand quickCloseCommand = new QuickCommand(new Command[]{new LightOffCommand(light), new ComputerOffCommand(computer), new DoorCloseCommand(door)});

controlPanel.setCommands(6, quickOpenCommand);

controlPanel.keyPressed(6);

  • 5、遥控器面板执行:CommandActivity.java

controlPanel.setCommands(0, new DoorOpenCommand(door));// 开门

controlPanel.keyPressed(0);

7. 装饰者模式

装饰者模式:若要扩展功能,装饰者提供了比集成更有弹性的替代方案,动态地将责任附加到对象上。

  • 先简单描述下装饰者模式发挥作用的地方,当我们设计好了一个类,我们需要给这个类添加一些辅助的功能,并且不希望改变这个类的代码,这时候就是装饰者模式大展雄威的时候了。这里还体现了一个原则:类应该对扩展开放,对修改关闭。

  • 需求:设计游戏的装备系统,基本要求,要可以计算出每种装备在镶嵌了各种宝石后的攻击力和描述:

  • 1、装备的超类:IEquip.java

  • 2、各个装备的实现类:

  • eg:武器的实现类: ArmEquip.java

  • 3、装饰品的超类(装饰品也属于装备):IEquipDecorator.java

  • 4、装饰品的实现类:

  • eg:蓝宝石的实现类(可累加): BlueGemDecorator.java

  • 5、最后测试:计算攻击力和查看描述:

Log.e("—", "一个镶嵌 2 颗红宝石,1 颗蓝宝石的靴子: ");

IEquip iEquip = new RedGemDecotator(new RedGemDecotator(new BlueGemDecotator(new ShoeEquip())));

Log.e("—", “攻击力:” + iEquip.caculateAttack());

Log.e("—", “描述语:” + iEquip.description());

8. 外观模式

定义:提供一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层的接口,让子系统更容易使用。其实就是为了方便客户的使用,把一群操作,封装成一个方法。

  • 需求:我比较喜欢看电影,于是买了投影仪、电脑、音响、设计了房间的灯光、买了爆米花机,然后我想看电影的时候,我需要一键观影和一键关闭。

  • 每个设备类的开关等操作:

  • eg: 爆米花机:PopcornPopper.java

  • 电影院类:HomeTheaterFacade.java

/**

  • 一键观影

*/

public void watchMovie() {

computer.on();

light.down();

popcornPopper.on();

popcornPopper.makePopcorn();

projector.on();

projector.open();

player.on();

player.make3DListener();

}

  • 最后测试:一键观影:

new HomeTheaterFacade(computer, light, player, popcornPopper, projector).watchMovie();

9. 模板方法模式

定义:定义了一个算法的骨架,而将一些步骤延迟到子类中,模版方法使得子类可以在不改变算法结构的情况下,重新定义算法的步骤。

  • 需求:简单描述一下:本公司有程序猿、测试、HR、项目经理等人,下面使用模版方法模式,记录下所有人员的上班情况

  • 模板方法模式中的三类角色

  • 1、具体方法(Concrete Method)

  • 2、抽象方法(Abstract Method)

  • 3、钩子方法(Hook Method)

  • 工人的超类:Worker.java

// 具体方法

public final void workOneDay() {

Log.e(“workOneDay”, “-----------------work start----------------”);

enterCompany();

work();

exitCompany();

Log.e(“workOneDay”, “-----------------work end----------------”);

}

// 工作 抽象方法

public abstract void work();

// 钩子方法

public boolean isNeedPrintDate() {

return false;

}

private void exitCompany() {

if (isNeedPrintDate()) {

Log.e(“exitCompany”, “—” + new Date().toLocaleString() + “—>”);

}

Log.e(“exitCompany”, name + “—离开公司”);

}

  • 程序员实现类(可得知时间):ITWorker.java

/**

  • 重写父类的此方法,使可以查看离开公司时间

*/

@Override

public boolean isNeedPrintDate() {

return true;

}

  • 最后测试:

  • 查看所有人员的工作情况:

QAWorker qaWorker = new QAWorker(“测试人员”);

qaWorker();

HRWorker hrWorker = new HRWorker(“莉莉姐”);

hrWorker.workOneDay();

  • 查看程序猿离开公司的时间:

ITWorker itWorker = new ITWorker(“jingbin”);

itWorker.workOneDay();

10. 状态模式

定义:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

  • 定义又开始模糊了,理一下,当对象的内部状态改变时,它的行为跟随状态的改变而改变了,看起来好像重新初始化了一个类似的。

  • 需求:已自动售货机为例(有已投币、未投币等状态和投币、投币等方法)

  • 最初实现待改进的售货机:VendingMachine.java

  • 改进后的售货机(更具有延展性):VendingMachineBetter.java

// 放钱

public void insertMoney() {

currentState.insertMoney();

}

// 退钱

public void backMoney() {

currentState.backMoney();

}

// 转动曲柄

public void turnCrank() {

currentState.turnCrank();

if (currentState == soldState || currentState == winnerState) {

currentState.dispense();//两种情况会出货

}

}

// 出商品

public void dispense() {

Log.e(“VendingMachineBetter”, “—发出一件商品”);

if (count > 0) {

count–;

}

}

// 设置对应状态

public void setState(State state) {

this.currentState = state;

}

  • 状态的接口:State.java

  • 对应状态的接口实现类:

  • eg: 中奖状态:WinnerState.java

  • eg: 售卖状态:SoldState.java

  • 改进后的售货机测试:

// 初始化售货机,且里面有 3 个商品

VendingMachineBetter machineBetter = new VendingMachineBetter(3);

machineBetter.insertMoney();

machineBetter.turnCrank();

Java 设计模式归纳(观察者、工厂、单例,进阶学习资料相关推荐

  1. Java 设计模式归纳(观察者、工厂、单例、策略、适配器、命令、装饰者、外观、模板方法、状态

    DesignPattern 项目地址:youlookwhat/DesignPattern  简介: Java 设计模式归纳 (观察者.工厂.单例.策略.适配器.命令.装饰者.外观.模板方法.状态). ...

  2. Java设计模式透析之 —— 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8860649 写软件的时候经常需要用到打印日志功能,可以帮助你调试和定位问题,项目上 ...

  3. java基础的三个框架,进阶学习资料!

    阿里巴巴一面 自我介绍这个就不说了,开头必问的 说一下StringBuilder 和 StringBuffer Spring bean加载,实例化的过程 Spring AOP源码看过吗 java内存模 ...

  4. Ruby设计模式透析之 —— 单例(Singleton)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/8868758 此为Java设计模式透析的拷贝版,专门为Ruby爱好者提供的,不熟悉R ...

  5. java饿汉式有啥作用,Java面试 - 什么是单例设计模式,为什么要使用单例设计模式,如何实现单例设计模式(饿汉式和懒汉式)?...

    什么是单例设计模式? 单例设计模式就是一种控制实例化对象个数的设计模式. 为什么要使用单例设计模式? 使用单例设计模式可以节省内存空间,提高性能.因为很多情况下,有些类是不需要重复产生对象的.如果重复 ...

  6. 【设计模式】-创造篇-单例

    单例定义 单例模式(Singleton)是一种非常简单且容易理解的设计模式.顾名思义,单例即单一的实例,确切地讲就是指在某个系统中只存在一个实例,同时提供集中.统一的访问接口,以使系统行为保持协调一致 ...

  7. Java 设计模式之静态工厂方法模式

    设计模式系列 创建型设计模式 Java 设计模式之单例模式 Java 设计模式之静态工厂方法模式 Java 设计模式之工厂方法模式 Java 设计模式之抽象工厂模式 Java 设计模式之Builder ...

  8. java设计模式3种工厂模式

    java设计模式3种工厂模式 2010-01-08 16:06:36|  分类: JAVA技术|举报|字号 订阅 下载LOFTER客户端 工厂模式分为三种: Simple Factory模式 专门定义 ...

  9. 设计模式是什么鬼(单例)

    转自:设计模式是什么鬼(单例) 之前我们讲过面向对象以及封装.继承.多态三大特性,底子打好了那我们就把设计模式一个个拆开来看看到底都是神些什么鬼,我们先从简单的单例说起吧.单例,顾名思义,整个系统其实 ...

最新文章

  1. Confluence 6 从你的 JDBC 连接中直接启用校验查询
  2. 确保***测试计划成功的10个秘诀(语录)
  3. 分布式理论(七): 一致性协议之 ZAB
  4. SAP物料主数据创建时间和创建个数的函数关系
  5. ASP.NET 4.0 取消表单危险字符验证
  6. 为什么说无线数传电台和增益天线是相辅相成关系?
  7. x264_macroblock_cache_load()
  8. MySQL-----改
  9. 世界末日倒计时 js代码
  10. Winsw将jar包部署为windows服务
  11. 广州科二化龙考场_广州市机动车驾驶人化龙考场交通路线攻略
  12. Xilinx FPGA等效门数计算
  13. Ionic4 Ionic-refresher 下拉更新
  14. 跳马问题C++递归调用
  15. 第八章 VAR模型与脉冲响应
  16. python后端开发学路线_【后端开发】Python要学哪些内容?Python程序员学习路线图...
  17. CaysnPrinter开发包接口说明文档及打印示例程序 - 20160715
  18. 漫画:并发系列 之 H2O的生成
  19. MES系统功能助力注塑行业降本增效
  20. Linux系统的系统架构

热门文章

  1. MRPII/ERP软件系统的实现(转)
  2. Android 定位c++异常
  3. 【资料】低功耗1/单通道/单按键触摸触控芯片VKD223B/EB/NB,适用于TWS/电池供电类触摸屏等
  4. python模拟支付宝蚂蚁森林的能量产生过程_Python+appium自动化实例(一):使用Python3+appium实现自动收取支付宝蚂蚁森林能量...
  5. matlab mbd 淘宝,完美起航-基于模型(MBD)的树莓派程序开发——设置树莓派自动连接wifi和使用指令连接Matlab/Simulink和树莓派(不使用树莓派连接向导连接)...
  6. 项目实战-仿bilibili刷新按钮的实现
  7. 安卓jni(ndk)开发实战(2)开发jni第一个HellowWorld程序
  8. swift:用UIWebView读取本地html文件
  9. 黑盒测试用例设计--因果图法
  10. FAQ_全志平台Tina3.0.7 RXXX cowbell方案启动时cpufreq报错且无法生成cpufreq节点