1.装饰模式

装饰(Decorator)模式又叫做包装模式.通过一种对客户端透明的方式来扩展对象的功能,是继承关系的一个替换方案.

package com.ibeifeng.news;public interface Car {public void show();public void run();
}
package com.ibeifeng.news;public abstract class CarDecorator implements Car{private Car car;public Car getCar() {return car;}public void setCar(Car car) {this.car = car;}public CarDecorator(Car car) {this.car = car;}public abstract void show();
}
package com.ibeifeng.news;public class FlyCarDecorator extends CarDecorator{public FlyCarDecorator(Car car) {super(car);}public void show() {this.getCar().show();this.fly();}public void fly() {System.out.println("可以飞");}public void run() {}
}
package com.ibeifeng.news;public class SwimCarDecorator extends CarDecorator {public SwimCarDecorator(Car car) {super(car);}public void show() {this.getCar().show();this.swim();}public void swim() {System.out.println("可以游");}public void run() {}}
package com.ibeifeng.news;public class MainClass {public static void main(String[] args) {Car car = new RunCar();car.show();System.out.println("---------");Car swimcar = new SwimCarDecorator(car);swimcar.show();System.out.println("---------");Car flySwimCar = new FlyCarDecorator(swimcar);flySwimCar.show();}
}

装饰模式的角色和职责
抽象组件角色:一个抽象接口,是被装饰类和装饰类的父接口.Car
具体组件角色:为抽象组件的实现类. RunCar
抽象装饰角色:包含一个组件的引用,并定义了与抽象组件一致的接口.CarDecorator
具体装饰角色:为抽象装饰角色的实现类.负责具体的装饰.FlyCarDecorator,FlyCarDecorator

3.策略模式

Strategy模式也叫策略模式是行为模式之一,它对一系列的算法加以封装,为所有算法定义一个抽象的算法接口,并通过继承该抽象算法接口对所有的算法加以封装和实现,具体的算法选择交由客户端决定(策略).Strategy模式主要用来平滑地处理算法的切换.

package com.ibeifeng.strategy;public interface Strategy {public double cost(double num);
}
package com.ibeifeng.strategy;public class StrategyA implements Strategy{public double cost(double num) {return num * 0.8;}}
package com.ibeifeng.strategy;public class StrategyB implements Strategy {public double cost(double num) {if(num >= 200) {return num - 50;}return num;}}
package com.ibeifeng.strategy;public class Context {private Strategy strategy;public Context(Strategy strategy) {this.strategy = strategy;}public double cost(double num){return this.strategy.cost(num);}}
package com.ibeifeng.strategy;public class MainClass {public static void main(String[] args) {double num = 200;Context context = new Context(new StrategyB());double newNum = context.cost(num);System.out.println("实际付账" + newNum + "元");}
}

策略模式的角色和职责
Strategy:策略(算法)抽象.
ConcreteStrategy:各种策略(算法)的具体实现.
Context:策略的外部封装类,或者说策略的容器类.根据不同策略执行不同的行为.策略由外部环境决定.
策略模式的优点
1.策略模式提供了管理相关算法族的办法.策略类的等级结构定义了一个算法或行为族.恰当使用继承可以把公共的代码移到父类里面,从而避免重复的代码.
2.策略模式提供了可以替换继承关系的办法.继承可以处理多种算法或行为.如果不是用策略模式,那么使用算法或行为的环境类就可能会有一些子类,每一个子类提供一个不同的算法或行为.但是,这样一来算法或行为的使用者就和算法或行为本身混在一起.决定使用哪一种算法或采取哪一种行为的逻辑和算法或行为的逻辑混合在一起.从而不可能在独立演化,继承使得动态改变算法或行为变得不可能.
3.使用策略模式可以避免使用多重条件转移语句.多重转移语句不易维护,它把采取哪一种算法或采取哪一种行为的逻辑与算法或行为的逻辑混合在一起,统统列在一个多重转移语句里面,比使用继承的办法还要原始和落后.
策略模式的缺点
1.客户端必须知道所有的策略类,并自行决定使用哪一个策略类.这就意味着客户端必须理解这些算法的区别,以便适时选择恰当的算法类.换言之,策略模式只适用于客户端知道所有的算法或行为的情况.
2.策略模式造成很多的策略类.有时候可以通过把依赖于环境的状态保存到客户端里面,而将策略类设计成可共享的,这样策略类实例可以被不同的客户端使用.换言之,可以使用享元模式来减少对象的数量.

3.观察者模式

Observer模式是行为模式之一,它的作用是当一个对象的状态发生变化时,能够自动通知其他关联对象,自动刷新对象状态.
Observer模式提供给关联对象一种同步通信的手段,使某个对象与依赖它的其他对象之间保持状态同步.
观察者模式的角色和职责
Subject(被观察者):被观察的对象.当需要被观察的状态发生变化时,需要通知队列中所有的观察者对象.Subject需要维持(添加,删除,通知)一个观察者对象的队列列表.
ConcreteSubject:被观察者的具体实现.包含一些基本的属性状态及其他操作.
Observer(观察者):接口或抽象类.当Subject的状态发生变化时,Observer对象将通过一个callback函数得到通知.
ConcreteBoserver:观察者的具体实现.得到通知后将完成一些具体的业务逻辑处理.

package com.ibeifeng.news;public class Article {private String articleTitle;private String articleContent;public String getArticleTitle() {return articleTitle;}public void setArticleTitle(String articleTitle) {this.articleTitle = articleTitle;}public String getArticleContent() {return articleContent;}public void setArticleContent(String articleContent) {this.articleContent = articleContent;}}
package com.ibeifeng.news;import java.util.Observable;
/*
*被观察者继承Observale
*/
public class BlogUser extends Observable {public void publishBlog(String articleTitle,String articleContent) {Article art = new Article();art.setArticleTitle(articleTitle);art.setArticleContent(articleContent);System.out.println("博主:发表新文章,文章标题:" + articleTitle + ",文章内容:" + articleContent);this.setChanged();this.notifyObservers(art);}
}
package com.ibeifeng.news;import java.util.Observable;
import java.util.Observer;
/*
*观察者实现Observer
*/
public class MyObServer implements Observer {public void update(Observable o, Object arg) {Article art = (Article)arg;System.out.println("博主发表了新的文章,快去看吧!");System.out.println("博客标题为:" + art.getArticleTitle());System.out.println("博客内容为:" + art.getArticleContent());}}
package com.ibeifeng.news;
//测试
public class MainClass {public static void main(String[] args) {BlogUser user = new BlogUser();//注册观察者user.addObserver(new MyObServer());user.publishBlog("哈哈,博客上线了", "大家多来访问");}
}

观察者模式的典型应用
/- 侦听事件驱动程序设计中的外部事件
/-侦听/监视某个对象的状态变化
/-发布者/订阅者(publisher/subscriber)模型中,当一个外部事件(新的产品,消息的出现等等)被触发时,通知邮件列表中的订阅者.

Java设计模式系列3-----装饰模式,策略模式,观察者模式相关推荐

  1. java设计模式实战-(反射+策略模式)

    学完23种设计模式,相信很多同学都疑问,除了单例模式.工厂模式其他模式还有运用的场景吗? 现在这里就举一个例子. 首先策略模式需要先有了解,我们常用策略模式解决实际开发中的if else特别多的场景. ...

  2. Java设计模式之3种策略模式实现

    一.什么是策略模式   所谓策略模式,就是定义了一组策略,分别封装在不同类中,每种策略都可以根据当前场景相互替换,从而使策略的变化可以独立于操作者.比如我们要去某个地方,会根据距离的不同来选择不同的出 ...

  3. Java设计模式(七)策略模式 模板模式

    (十三)策略模式 策略图案限定了多个封装算法,该算法可以相互替换包.法的客户.借用还有一位大神的样例. interface ICalculator{public int calculate(Strin ...

  4. 【Java设计模式系列】装饰器模式(Decorator Pattern)

    简介 一般有两种方式可以给一个类或对象新增行为: 继承 子类在拥有自身方法同时还拥有父类方法.但这种是静态的,用户无法控制增加行为的方式和时机. 关联 将一个类的对象嵌入另一个对象,由另一个对象决定是 ...

  5. 《JAVA设计模式系列》责任链模式

    文章目录 责任链模式 责任链模式优缺点 应用场景 责任链模式的结构 实现流程 责任链模式 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链.这 ...

  6. Java设计模式(16)中介模式(Mediator模式)

    Mediator定义:用一个中介对象来封装一系列关于对象交互行为. 为何使用Mediator模式/中介模式 各个对象之间的交互操作非常多,每个对象的行为操作都依赖彼此对方,修改一个对象的行为,同时会涉 ...

  7. Java设计模式(1)工厂模式(Factory模式)

    工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因 ...

  8. Java设计模式(8)组合模式(Composite模式)

    Composite定义:将对象以树形结构组织起来,以达成"部分-整体" 的层次结构,使得客户端对单个对象和组合对象的使用具有一致性. Composite比较容易理解,想到Compo ...

  9. Java设计模式(10)代理模式(Proxy模式)

    理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水,享受游刃有余的乐趣. Proxy是比较有用途的一种模式,而且变种较多,应用场合覆盖从小结构到整个系统的大结构,P ...

  10. 初探Java设计模式3:行为型模式(策略,观察者等)

    转自https://javadoop.com/post/design-pattern 行为型模式 策略模式 观察者模式 责任链模式 模板方法模式 状态模式 行为型模式总结 本系列文章将整理到我在Git ...

最新文章

  1. 电子科技学院计算机调剂,2020年电子科技大学电子科学技术研究院考研调剂信息...
  2. try catch异常后会执行后面的代码吗_JVM异常处理最强讲解
  3. Java 编译期与运行期,别傻傻分不清楚!
  4. 熔断器---Hystrix
  5. RabbitMQ简介和六种工作模式详解
  6. 103. 二叉树的锯齿形层次遍历
  7. Android蓝牙4.0的数据通讯
  8. golang chan 探究
  9. Elasticsearch Curator使用
  10. 【英语学习】【WOTD】glitch 释义/词源/示例
  11. Java设计模式学习总结(15)——行为型模式之责任链模式
  12. 02 | 纵览全局:把握 Netty 整体架构脉络
  13. 阻塞与非阻塞都是什么呢?
  14. C# 新特性 操作符单?与??和 ?. 的使用
  15. yuzu 使用指南:如何在 PC 上运行 Switch 游戏
  16. Vue仿微信朋友圈项目
  17. Thinking in java 第21章 并发 wait() 与 notifyAll()
  18. 手机端 js禁止页面滚动
  19. Mediakit报告设备商的空间不足以执行此操作的纯MAC解法
  20. 计算机开机桌面黑屏怎么办,小编教你电脑启动后黑屏该怎么办

热门文章

  1. Android中.9图片快捷的制作
  2. mPEG-SS 甲氧基PEG琥珀酰亚胺丁二酸酯
  3. 计算机毕业设计ssm宠物领养平台2x520系统+程序+源码+lw+远程部署
  4. Python 3.8.0百度网盘资源下载
  5. 鸿蒙Harmony负责人手王成录被曝已离职:华为技术元老,1998年哈工大博士毕业后加入...
  6. 第8节 实例-写个简单的操作器
  7. 汤臣倍健创业25周年,宣布公司未来3年四个战略重点
  8. keil的sct文件_STM32 分散加载文件 .sct 解析
  9. hdu 5128 The E-pang Palace (有技巧的暴力)
  10. if...then...else逻辑