C、关系模式(11种)

先来张图,看看这11中模式的关系:

第一类:通过父类与子类的关系进行实现。

第二类:两个类之间。

第三类:类的状态。

第四类:通过中间类

父类与子类关系

13、策略模式(strategy)

策略模式定义了一系列算法,并将每个算法封装起来,使他们可以相互替换,且算法的变化不会影响到使用算法的客户。需要设计一个接口,为一系列实现类提供统一的方法,多个实现类实现该接口,设计一个抽象类(可有可无,属于辅助类),提供辅助函数,关系图如下:

图中ICalculator提供同意的方法,

AbstractCalculator是辅助类,提供辅助方法,接下来,依次实现下每个类:

首先统一接口:

[java] view plaincopy

  1. public interface ICalculator {
  2. public int calculate(String exp);
  3. }

辅助类:

[java] view plaincopy

  1. public abstract class AbstractCalculator {
  2. public int[] split(String exp,String opt){
  3. String array[] = exp.split(opt);
  4. int arrayInt[] = new int[2];
  5. arrayInt[0] = Integer.parseInt(array[0]);
  6. arrayInt[1] = Integer.parseInt(array[1]);
  7. return arrayInt;
  8. }
  9. }

三个实现类:

[java] view plaincopy

  1. public class Plus extends AbstractCalculator implements ICalculator {
  2. @Override
  3. public int calculate(String exp) {
  4. int arrayInt[] = split(exp,"+");
  5. return arrayInt[0]+arrayInt[1];
  6. }
  7. }

[java] view plaincopy

  1. public class Minus extends AbstractCalculator implements ICalculator {
  2. @Override
  3. public int calculate(String exp) {
  4. int arrayInt[] = split(exp,"-");
  5. return arrayInt[0]-arrayInt[1];
  6. }
  7. }

[java] view plaincopy

  1. public class Multiply extends AbstractCalculator implements ICalculator {
  2. @Override
  3. public int calculate(String exp) {
  4. int arrayInt[] = split(exp,"*");
  5. return arrayInt[0]*arrayInt[1];
  6. }
  7. }

简单的测试类:

[java] view plaincopy

  1. public class StrategyTest {
  2. public static void main(String[] args) {
  3. String exp = "2+8";
  4. ICalculator cal = new Plus();
  5. int result = cal.calculate(exp);
  6. System.out.println(result);
  7. }
  8. }

输出:10

策略模式的决定权在用户,系统本身提供不同算法的实现,新增或者删除算法,对各种算法做封装。因此,策略模式多用在算法决策系统中,外部用户只需要决定用哪个算法即可。

14、模板方法模式(Template Method)

解释一下模板方法模式,就是指:一个抽象类中,有一个主方法,再定义1...n个方法,可以是抽象的,也可以是实际的方法,定义一个类,继承该抽象类,重写抽象方法,通过调用抽象类,实现对子类的调用,先看个关系图:

就是在AbstractCalculator类中定义一个主方法calculate,calculate()调用spilt()等,Plus和Minus分别继承AbstractCalculator类,通过对AbstractCalculator的调用实现对子类的调用,看下面的例子:

[java] view plaincopy

  1. public abstract class AbstractCalculator {
  2. /*主方法,实现对本类其它方法的调用*/
  3. public final int calculate(String exp,String opt){
  4. int array[] = split(exp,opt);
  5. return calculate(array[0],array[1]);
  6. }
  7. /*被子类重写的方法*/
  8. abstract public int calculate(int num1,int num2);
  9. public int[] split(String exp,String opt){
  10. String array[] = exp.split(opt);
  11. int arrayInt[] = new int[2];
  12. arrayInt[0] = Integer.parseInt(array[0]);
  13. arrayInt[1] = Integer.parseInt(array[1]);
  14. return arrayInt;
  15. }
  16. }

[java] view plaincopy

  1. public class Plus extends AbstractCalculator {
  2. @Override
  3. public int calculate(int num1,int num2) {
  4. return num1 + num2;
  5. }
  6. }

测试类:

[java] view plaincopy

  1. public class StrategyTest {
  2. public static void main(String[] args) {
  3. String exp = "8+8";
  4. AbstractCalculator cal = new Plus();
  5. int result = cal.calculate(exp, "+");
  6. System.out.println(result);
  7. }
  8. }

我跟踪下这个小程序的执行过程:首先将exp和"+"做参数,调用AbstractCalculator类里的calculate(String,String)方法,在calculate(String,String)里调用同类的split(),之后再调用calculate(int ,int)方法,从这个方法进入到子类中,执行完return num1 + num2后,将值返回到AbstractCalculator类,赋给result,打印出来。正好验证了我们开头的思路。

类之间的关系

15、观察者模式(Observer)

包括这个模式在内的接下来的四个模式,都是类和类之间的关系,不涉及到继承,学的时候应该 记得归纳,记得本文最开始的那个图。观察者模式很好理解,类似于邮件订阅和RSS订阅,当我们浏览一些博客或wiki时,经常会看到RSS图标,就这的意思是,当你订阅了该文章,如果后续有更新,会及时通知你。其实,简单来讲就一句话:当一个对象变化时,其它依赖该对象的对象都会收到通知,并且随着变化!对象之间是一种一对多的关系。先来看看关系图:

我解释下这些类的作用:MySubject类就是我们的主对象,Observer1和Observer2是依赖于MySubject的对象,当MySubject变化时,Observer1和Observer2必然变化。AbstractSubject类中定义着需要监控的对象列表,可以对其进行修改:增加或删除被监控对象,且当MySubject变化时,负责通知在列表内存在的对象。我们看实现代码:

一个Observer接口:

[java] view plaincopy

  1. public interface Observer {
  2. public void update();
  3. }

两个实现类:

[java] view plaincopy

  1. public class Observer1 implements Observer {
  2. @Override
  3. public void update() {
  4. System.out.println("observer1 has received!");
  5. }
  6. }

[java] view plaincopy

  1. public class Observer2 implements Observer {
  2. @Override
  3. public void update() {
  4. System.out.println("observer2 has received!");
  5. }
  6. }

Subject接口及实现类:

[java] view plaincopy

  1. public interface Subject {
  2. /*增加观察者*/
  3. public void add(Observer observer);
  4. /*删除观察者*/
  5. public void del(Observer observer);
  6. /*通知所有的观察者*/
  7. public void notifyObservers();
  8. /*自身的操作*/
  9. public void operation();
  10. }

[java] view plaincopy

  1. public abstract class AbstractSubject implements Subject {
  2. private Vector vector = new Vector();
  3. @Override
  4. public void add(Observer observer) {
  5. vector.add(observer);
  6. }
  7. @Override
  8. public void del(Observer observer) {
  9. vector.remove(observer);
  10. }
  11. @Override
  12. public void notifyObservers() {
  13. Enumeration enumo = vector.elements();
  14. while(enumo.hasMoreElements()){
  15. enumo.nextElement().update();
  16. }
  17. }
  18. }

[java] view plaincopy

  1. public class MySubject extends AbstractSubject {
  2. @Override
  3. public void operation() {
  4. System.out.println("update self!");
  5. notifyObservers();
  6. }
  7. }

测试类:

[java] view plaincopy

  1. public class ObserverTest {
  2. public static void main(String[] args) {
  3. Subject sub = new MySubject();
  4. sub.add(new Observer1());
  5. sub.add(new Observer2());
  6. sub.operation();
  7. }
  8. }

输出:

update self!

observer1 has received!

observer2 has received!

这些东西,其实不难,只是有些抽象,不太容易整体理解,建议读者:根据关系图,新建项目,自己写代码(或者参考我的代码),按照总体思路走一遍,这样才能体会它的思想,理解起来容易!

16、迭代子模式(Iterator)

顾名思义,迭代器模式就是顺序访问聚集中的对象,一般来说,集合中非常常见,如果对集合类比较熟悉的话,理解本模式会十分轻松。这句话包含两层意思:一是需要遍历的对象,即聚集对象,二是迭代器对象,用于对聚集对象进行遍历访问。我们看下关系图:

这个思路和我们常用的一模一样,MyCollection中定义了集合的一些操作,MyIterator中定义了一系列迭代操作,且持有Collection实例,我们来看看实现代码:

两个接口:

[java] view plaincopy

  1. public interface Collection {
  2. public Iterator iterator();
  3. /*取得集合元素*/
  4. public Object get(int i);
  5. /*取得集合大小*/
  6. public int size();
  7. }

[java] view plaincopy

  1. public interface Iterator {
  2. //前移
  3. public Object previous();
  4. //后移
  5. public Object next();
  6. public boolean hasNext();
  7. //取得第一个元素
  8. public Object first();
  9. }

两个实现:

[java] view plaincopy

  1. public class MyCollection implements Collection {
  2. public String string[] = {"A

java 观察者模式_设计模式:全面通晓23种设计模式(典藏查阅)-第三部分相关推荐

  1. JAVA设计模式总结之23种设计模式(重点!!!)

    JAVA设计模式总结之23种设计模式: 一.什么是设计模式 设计模式遵循的原则有6个: 二.设计模式的三个分类 三.各分类中模式的关键点 四.概说23种设计模式 1.单例模式(Singleton) 2 ...

  2. JAVA设计模式总结之23种设计模式

    一.什么是设计模式                                                                                           ...

  3. java外围设计_Java 编程(23 种设计模式)

    简介 在一般的程序开发过程中,初中级程序员接触的程序设计模式是比较少的.最常见的可能就是单例模式.工厂模式.抽象工厂模式等等,但实际上程序中的设计模式是非常多的,具体可以分为 23 种设计模式.设计模 ...

  4. 五分钟精通设计模式(一)--速记23种设计模式

    本文由程序员伟哥原创,若需要转载,请注明出处. 通过我杜撰的一个新白娘子传奇故事帮助大家记忆23种设计模式 三类设计模式: 三类设计模式可以这么记: 一.白素贞闯入人满为患的大街上(闯街--创建) 刚 ...

  5. 设计模式学习,23种设计模式详解:概述

    设计模式学习:概述 首先,别把程序设计不当设计! 程序的框架就是建筑物的骨架,内部实现不过是装修改造.只要骨架设计没有问题,装修起来也是得心应手.一个糟糕的程序框架,对于接下来的Debug和程序的更新 ...

  6. 设计模式概述以及 23种设计模式的介绍

    文章目录 设计模式概述(Design pattern): 设计模式3大类 设计模式的七大原则 设计模式概述(Design pattern): 设计模式:代表了最佳的实践,通常被有经验的面向对象的软件开 ...

  7. 设计模式概述 以及 23种设计模式的介绍

    设计模式概述(Design pattern): 设计模式:代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用.设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案.这些解决方案是众 ...

  8. 运用多种设计模式的综合案例_北风网原创Java设计模式全面解析(23种设计模式综合实例应用)...

    Tech By APP开发 联系我们:  手机版 本站仅提供盘多多如风搜和盘搜搜以及小说网笔趣阁的资源搜索服务,不存放任何实质内容.如有侵权内容请联系百度云盘或新浪微盘,源资源删除后本站的链接将自动失 ...

  9. 【设计模式】:23种设计模式

    目录 创建型 1. Factory Method(工厂方法) 2. Abstract Factory(抽象工厂) 3. Builder(建造者) 4. Prototype(原型) 5. Singlet ...

最新文章

  1. java 导出csv 格式,java导出csv格式文件的方法
  2. Google Map API使用详解(十)——使用JavaScript创建地图详解(上)
  3. SourceInsight 4.0 之四 项目配置(库文件引入、配置宏添加、快捷键修改等)
  4. plsql(轻量版)_触发器
  5. git教程(二)--安装和配置git
  6. 获取网页html内容
  7. 魔兽登录后 服务器那显示不兼容,魔兽世界服务器不兼容什么意思?魔兽世界服务器不兼容解决方法...
  8. mbr分区磁盘如何转换成gpt分区磁盘?
  9. 银河战舰的最后一门重炮──C罗
  10. codemirror 只读模式(vue)
  11. python定义单位矩阵_单位矩阵与正则矩阵NumPy/Python的高效Kronecker积
  12. Zephyr参考文档
  13. 常用DEBUG命令及使用详解
  14. 关于ITSS的一些问答......
  15. 4、Channel(通道)
  16. 微信接口源码、微信定制功能源码
  17. 讯闪2007正式版,菜单自身穿透保存的问题!
  18. 解决Vue前后端跨域问题的多种方式
  19. 禁止的回文子串 Dyslexic Gollum
  20. Win7 64位电脑没有声音,重装声卡也无法解决的办法。

热门文章

  1. 嵌入式linux的学习笔记-pipe管道(二)
  2. 今天终于可以正常下班了
  3. Asp.net2.0里访问Web.config的Section的示例
  4. autodock tool文件_理解autodock分子对接思路和流程--系列导读
  5. CCF201709-2 公共钥匙盒
  6. CCF202112-1 序列查询
  7. python生成器next_Python生成器生成next,python,yieldnext
  8. python爬取京东商品信息代码_Python利用Xpath选择器爬取京东网商品信息
  9. 周五下午3h直播丨2021第5期大咖讲坛:数据库安全与智能运维
  10. 数据和云2020年度最受欢迎的Top10文章、专栏、文档、直播资源大放送(建议收藏)...