今天在准备腾讯的面试时想起来要复习一下设计模式,而刚好前几天在参加网易的在线考试的时候,也出了一道关于设计模式的选择题,主要是考察观察者模式,虽然那道题自己做对了,但觉得还是应该好好总结一下设计模式的内容。

一、设计模式的分类

总体来说设计模式分为三大类:

创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。

结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。

行为型模式,共十一种:策略模式、模板方法模式、观察者模式、迭代子模式、责任链模式、命令模式、备忘录模式、状态模式、访问者模式、中介者模式、解释器模式。

二、设计模式的六大原则

1、开闭原则(Open Close Principle)

开闭原则就是说对扩展开放,对修改关闭。在程序需要进行拓展的时候,不能去修改原有的代码,实现一个热插拔的效果。所以一句话概括就是:为了使程序的扩展性好,易于维护和升级。想要达到这样的效果,我们需要使用接口和抽象类,后面的具体设计中我们会提到这点。

2、里氏代换原则(Liskov Substitution Principle)

里氏代换原则(Liskov Substitution Principle LSP)面向对象设计的基本原则之一。 里氏代换原则中说,任何基类可以出现的地方,子类一定可以出现。 LSP是继承复用的基石,只有当衍生类可以替换掉基类,软件单位的功能不受到影响时,基类才能真正被复用,而衍生类也能够在基类的基础上增加新的行为。里氏代换原则是对“开-闭”原则的补充。实现“开-闭”原则的关键步骤就是抽象化。而基类与子类的继承关系就是抽象化的具体实现,所以里氏代换原则是对实现抽象化的具体步骤的规范。

3、依赖倒转原则(Dependence Inversion Principle)

这个是开闭原则的基础,具体内容:真对接口编程,依赖于抽象而不依赖于具体。

4、接口隔离原则(Interface Segregation Principle)

这个原则的意思是:使用多个隔离的接口,比使用单个接口要好。还是一个降低类之间的耦合度的意思,从这儿我们看出,其实设计模式就是一个软件的设计思想,从大型软件架构出发,为了升级和维护方便。所以上文中多次出现:降低依赖,降低耦合。

5、迪米特法则(最少知道原则)(Demeter Principle)

最少知道原则,就是说:一个实体应当尽量少的与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则(Composite Reuse Principle)

原则是尽量使用合成/聚合的方式,而不是使用继承。

三观察者模式

1 概述:

观察者模式(又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式),观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时,会通知所有观察者对象,使它们能够自动更新自己,此种模式通常被用来实现事件处理系统,如java和安卓中的监听器。

2举例:

观察者模式(Observer)完美的将观察者和被观察的对象分离开。举个例子,用户界面可以作为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现数据变化后,就显示在界面上。面向对象设计的一个原则是:系统中的每个类将重点放在某一个功能上,而不是其他方面。一个对象只做一件事情,并且将他做好。观察者模式在模块之间划定了清晰的界限,提高了应用程序的可维护性和重用性。观察者设计模式定义了对象间的一种一对多的依赖关系,以便一个对象的状态发生变化时,所有依赖于它的对象都得到通知自动刷新。

3模式结构:

观察者模式的结构中包括四种角色:
 主题(Subject)
 观察者(Observer) 
 具体主题(ConcreteSubject) 
 具体观察者(ConcreteObserver)

4观察者模式的UML类图:


5观察者模式代码结构:(节选自百度百科)

//抽象的观察者,需要用到观察者模式的类需实现此接口
public interface Observer{void update(Object...objs);
}//抽象的被观察者
public abstract class Observable{public final ArrayList<Class<?>> obserList = new ArrayList<Class<?>>();/**AttachObserver(通过实例注册观察者)*<b>Notice:</b>obcan'tbenull,oritwillthrowNullPointerException**/public<T> void registerObserver(Tob){if(ob==null) throw new NullPointerException();this.registerObserver(ob.getClass());}/***AttachObserver(通过Class注册观察者)*@paramcls*/public void registerObserver(Class<?>cls){if(cls==null) throw new NullPointerException();synchronized(obserList){if(!obserList.contains(cls)){obserList.add(cls);}}}/**UnattachObserver(注销观察者)*<b>Notice:</b>*<b>ItreverseswithattachObserver()method</b>**/public<T>void unRegisterObserver(Tob){if(ob==null) throw new NullPointerException();this.unRegisterObserver(ob.getClass());}/**UnattachObserver(注销观察者,有时候在未获取到实例使用)*<b>Notice:</b>*<b>ItreverseswithattachObserver()method</b>**/public void unRegisterObserver(Class<?>cls){if(cls==null) throw new NullPointerException();synchronized(obserList){Iterator<Class<?>>iterator=obserList.iterator();while(iterator.hasNext()){if(iterator.next().getName().equals(cls.getName())){iterator.remove();break;}}}}/**detachallobservers*/public void unRegisterAll(){synchronized(obserList){obserList.clear();}}/**Ruturnthesizeofobservers*/public int countObservers(){synchronized(obserList){returnobserList.size();}}/***notify all observer(通知所有观察者,在子类中实现)*@paramobjs*/public abstract void notifyObservers(Object... objs);/***notify one certain observer(通知某一个确定的观察者)*@paramcls*@paramobjs*/public abstract void notifyObserver(Class<?> cls, Object... objs);/***notifyonecertainobserver*@paramcls*@paramobjs*/public abstract<T> void notifyObserver(T t, Object... objs);
}//目标被观察者
public class ConcreteObservable extends Observable{private static ConcreteObservableinstance = null;private ConcreteObservable(){};public static synchronized ConcreteObservablegetInstance(){if(instance == null){instance=newConcreteObservable();}returninstance;}@Overridepublic <T> void notifyObserver(T t, Object... objs){if(t == null) throw new NullPointerException();this.notifyObserver(t.getClass(), objs);}@Overridepublic void notifyObservers(Object... objs){for(Class<?>cls : obserList){this.notifyObserver(cls, objs);}}//通过java反射机制实现调用@Overridepublic void notifyObserver(Class<?>cls, Object...objs){if(cls == null) throw new NullPointerException();Method[] methods = cls.getDeclaredMethods();for(Method method : methods){if(method.getName().equals("update")){try{method.invoke(cls,objs);break;}catch(IllegalArgumentException e){e.printStackTrace();}catch(IllegalAccessException e){e.printStackTrace();}catch(InvocationTargetException e){e.printStackTrace();}}}}
}//使用(实现Observer接口)
public class Text extends Activity implements Observer{publicvoidonCreate(...){ConcreteObservable.getInstance().registerObserver(Text.class);....}public void update(Object...objs){//做操作,如更新数据,更新UI等}
}


转载于:https://www.cnblogs.com/hainange/p/6334056.html

【设计模式】java设计模式总述及观察者模式相关推荐

  1. java漂亮的模板设计代码_JAVA模板方法设计模式——Java设计模式,写漂亮的代码——...

    Java设计模式,写漂亮的代码 ----模板方法设计模式 简介: 模板方法设计模式是Java设计模式中很简单.应用非常广泛的的一种设计模式,该模式体现了编程的抽象思想(抽象是所有子类的共性封装), 仅 ...

  2. 啃碎并发(一):Java线程总述与概念

    2019独角兽企业重金招聘Python工程师标准>>> 1 前言 在JDK5之前,Java多线程以及其性能一直是个软肋,只有synchronized.Thread.sleep().O ...

  3. JAVA bridge设计模式,java设计模式之Bridge

    Bridge定义 : 将抽象和行为划分开来,各自独立,但能动态的结合. 为什么使用? 通常,当一个抽象类或接口有多个具体实现(concrete subclass),这些concrete之间关系可能有以 ...

  4. Java 设计模式之Builder模式

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

  5. Java后端架构师的成长之路(二)——Java设计模式(1)

    Java设计模式 Java设计模式入门 先看几个经典的面试题 原型设计模式问题 设计模式的七大原则 金融借贷平台项目 解释器设计模式 单例设计模式 设计模式的重要性 设计模式七大原则 设计模式的目的 ...

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

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

  7. Java设计模式(二)简单工厂模式—设计模式六大原则

    文章目录 设计模式六大原则 1. 开闭原则 2. 里氏代换原则 3. 依赖倒转原则 4. 接口隔离原则 5. 迪米特法则(最少知道原则) 6. 合成复用原则 工厂设计模式 什么是工厂模式 工厂模式的好 ...

  8. java设计模式观察者模式吗_Java设计模式之观察者模式原理与用法详解

    Java设计模式之观察者模式原理与用法详解 本文实例讲述了Java设计模式之观察者模式原理与用法.分享给大家供大家参考,具体如下: 什么是观察者模式 可以这么理解: 观察者模式定义了一种一对多的依赖关 ...

  9. 【秒懂设计模式】总述及工厂模式

    秒懂设计模式--总述及工厂模式 [前言]每次一说道"设计模式"总会给人一种误区,认为这些东西,只有那些"技术大牛"才会玩的东西.但是给我的感觉却恰恰相反,它更应 ...

  10. Java 设计模式之《观察者模式》

    很久之前,自己也曾看过一些设计模式的内容,最近在做一些程序代码设计的时,发现忘得差不多了,很多模式也只是有大致影响,决定重新将一些常用的模式复习一下.今天一个模式观察者模式. 观察者模式 观察者模式属 ...

最新文章

  1. DotNet Core 介绍
  2. 最详细的最小堆构建、插入、删除的过程图解
  3. spingBoot整合mybatis+generator+pageHelper
  4. rstudio查询命令_Rstudio支持可视化的Markdown编辑了?
  5. EDAS投稿出现问题: notembedded: Upload failed: The font Helvetica is not embedded in the file
  6. spring+springmvc+mybatis实现图书管理系统_Spring、SpringMVC、Mybatis自学视频分享
  7. sqlserver 'sa'密码忘记,windows集成身份验证都登录不了解决办法
  8. 《上海堡垒》究竟几何?让我用爬虫一探究竟
  9. 论文阅读-Social Fingerprinting:detection of spambot groups through DNA-inspired behavioral modelingCCFA
  10. OPC UA SDK案例:虹科OPC UA SDK助力立功科技ZWS云平台
  11. html毕业论文参考文献,本科毕业论文参考文献规范格式
  12. idea中项目文件颜色含义
  13. 带你快速入门AXI4总线--AXI4-Lite篇(3)----XILINX AXI4-Lite接口IP源码仿真分析(Master接口)
  14. 绿纹龙的森林游记——UPC
  15. 【开源】SoDiaoEditor 可能是目前最好用的开源电子病历编辑器(B/S架构)
  16. 计算机网络并行传输和串行传输,并行传输和串行传输的区别是什么
  17. 虾皮shopee蓝海词怎么找?挖掘shopee蓝海词有哪些技巧?
  18. 【愚公系列】2022年04月 微信小程序-项目篇(公交查询)-01周边站点
  19. 超详细的CentOS7.4下载与图文安装
  20. The Asset used by component in XXX scene “XXX.fire“ is missing. Detailed information:

热门文章

  1. Missive for Mac(邮件处理客户端)最新版
  2. Python- 索引 B+数 比如书的目录
  3. 洛谷P4074 [WC2013]糖果公园(莫队)
  4. String 将GBK转UTF-8
  5. click事件的执行顺序
  6. cookie控制窗口打开打开
  7. 关于动态规划,你该了解这些!
  8. 程序员为什么需要学会Markdown
  9. 从关系型数据库到非关系数据库
  10. 苹果mac图片处理软件 :Photoshop