分类(常见的设计模式)

1.创建型模式

  a) 工厂模式

  b) 抽象工厂模式

  c) 单例模式

  d) 建造者模式

2.结构型模式

  a) 适配器模式

  b) 装饰器模式

  c) 桥接模式

  d) 代理模式

3.行为型模式

  a) 命令模式

  b) 迭代器模式

  c) 策略模式

  d) 观察者模式

六大原则

1、开闭原则

  对扩展开放,对修改关闭。

2、里氏代换原则

  任何基类可以出现的地方,子类一定可以出现。

3、依赖倒转原则

  依赖于抽象而不依赖于具体。

4、接口隔离原则

  使用多个隔离的接口,比使用单个接口要好。

5、迪米特法则,又称最少知道原则

  一个实体应当尽量少地与其他实体之间发生相互作用,使得系统功能模块相对独立。

6、合成复用原则

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

一、工厂模式 

作用

一个抽象的接口,多个抽象接口的实现类,一个工厂,用来实例化抽象的接口。

优点

一个调用者想创建一个对象,直接向工厂请求即可,不需要知道具体实现,以提高系统的可维护性、可扩展性。

缺点

产品修改时,工厂也要进行修改。

代码

二、抽象工厂模式

作用

抽象工厂模式(Abstract Factory Pattern)是围绕一个超级工厂创建其他工厂。

优点

当一个产品类型(每一类中有多个产品)被设计成一起工作时,有良好的维护性。

缺点

产品类扩展困难。

三、单例模式

作用

保证一个类仅有一个实例,并提供一个访问它的全局访问点。

特点

1、单例类只能有一个实例。

2、单例类必须自己创建自己的唯一实例。

3、单例类必须给所有其他对象提供这一实例。

懒汉式

线程不安全

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

线程安全

public class Singleton {

private static Singleton instance;

private Singleton (){}

public static synchronized Singleton getInstance() {

if (instance == null) {

instance = new Singleton();

}

return instance;

}

}

双检锁

public class Singleton {

private static Singleton singleton;

private Singleton (){}

public static Singleton getSingleton() {

if (singleton == null) {

synchronized (Singleton.class) {

if (singleton == null) {

singleton = new Singleton();

}

}

}

return singleton;

}

}

静态内部类

public class Singleton {

private static class SingletonHolder {

private static final Singleton INSTANCE = new Singleton();

}

private Singleton (){}

public static final Singleton getInstance() {

return SingletonHolder.INSTANCE;

}

}

饿汉式

public class Singleton {

private static final Singleton instance = new Singleton();

private Singleton (){}

public static Singleton getInstance() {

return instance;

}

}

四、建造者模式

作用

建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。

应用实例

肯德基里,汉堡、可乐、薯条、炸鸡翅等是不变的,而其组合是经常变化的,生成出所谓的"套餐"。

角色

  抽象建造者角色:一个抽象接口,以规范产品对象的各个组成成分的建造。

  具体建造者角色:实现抽象建造者Builder所声明的接口,给出一步一步地完成创建产品实例的操作。

  导演者角色:担任这个角色的类调用具体建造者角色以创建产品对象。应当指出的是,导演者角色并没有产品类的具体知识,真正拥有产品类的具体知识的是具体建造者角色。

  产品角色:产品便是建造中的复杂对象。一般来说,一个系统中会有多于一个的产品类,而且这些产品类并不一定有共同的接口,而完全可以是不相关联的。

例子

五、适配器模式

作用

将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以在一起工作。

模式中的角色

1.目标接口(Target):客户所期待的接口。目标可以是具体的或抽象的类,也可以是接口。

2.需要适配的类(Adaptee):需要适配的类或适配者类。

3.适配器(Adapter):实现了目标接口,通过包装一个需要适配的对象,把原接口转换成目标接口。 

通过适配器把需要适配的类转成目标类

优点

  1. 接口可以转成自己希望的另一个接口
  2. 提高了类的复用。

缺点

过多地使用适配器,会让系统非常零乱,不易整体进行把握。

例子

六、装饰者模式

作用

对已有的业务逻辑进一步的封装,使其增加额外的功能。即向一个现有的对象添加新的功能,同时又不改变其结构。

优点

可以提供比继承更多的灵活性。

缺点

多层装饰比较复杂。

例子

实物基类

鸡肉

鸭肉

装饰者基类

蒸-装饰者

烤-装饰者

七、桥接模式

作用

将抽象部分与实现部分分离,使它们都可以独立的变化。把两个角色之间的继承关系改为了耦合的关系。

例子

八、代理模式

作用

一个类代理另一个类的功能。

模式中的角色

  1. 抽象角色:声明真实对象和代理对象的共同接口。 
    2. 代理角色:代理对象角色内部含有对真实对象的引用,继承了抽象对象。 
    3. 真实角色:代理角色所代表的真实对象,是我们最终要引用的对象。

缺点

由于在客户端和真实主题之间增加了代理对象,因此有些类型的代理模式可能会造成请求的处理速度变慢。

例子

九、命令模式

作用

将一个命令封装成一个对象,可以对命令接受者进行不同的命令处理。

组成

命令接受者:执行命令的对象。

命令:操作命令接受者执行命令。

命令对象入口:要求命令对象执行请求,通常会持有命令对象,可以持有很多的命令对象。

例子

十、迭代器模式

作用

这种模式用于顺序访问集合对象的元素,不需要知道集合对象的底层表示。

通过容器获取迭代器,通过迭代器遍历元素。

角色

1.迭代器接口

2.迭代器具体实现

3.抽象容器

4.具体容器

例子

迭代器接口

public interface Iterator {

public Object first();

public Object previous();

public Object next();

public boolean hasNext();

}

具体迭代器

public class MyIterator implements Iterator{

private List<Object> list;

private int index = 0;

public MyIterator(List<Object> list) {

this.list = list;

}

@Override

public Object previous() {

if((this.index - 1) < 0){

return null;

}else{

return this.list.get(--index);

}

}

@Override

public Object next() {

if((this.index + 1) >= this.list.size()){

return null;

}else{

return this.list.get(++index);

}

}

@Override

public boolean hasNext() {

if(this.index < (this.list.size() - 1)){

return true;

}

return false;

}

@Override

public Object first() {

if(this.list.size() <= 0){

return null;

}else{

return this.list.get(0);

}

}

}

容器接口

package com.pichen.dp.behavioralpattern.iterator;

public abstract class Container {

public abstract Iterator iterator();

public abstract void put(Object obj);

}

具体容器

public class MyContainer extends Container{

private List<Object> list;

public MyContainer() {

this.list = new ArrayList<Object>();

}

@Override

public void put(Object obj){

this.list.add(obj);

}

@Override

public Iterator iterator() {

return new MyIterator(list);

}

}

十一、策略模式

作用

  将多个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。

组成

  1.抽象策略角色:通常由一个接口或者抽象类实现。

  2.具体策略角色: 包装了相关的算法和行为。

  3.环境角色: 持有一个策略类的引用,最终给客户端调用。

实际举例

  旅行的出游方式,选择骑自行车、坐汽车,每一种旅行方式都是一个策略。

例子

十二、观察者模式

作用

它定义了一种一对多的依赖关系,让多个观察者对象同时监听某一个主题对象。这个主题对象在状态变化时,会通知所有的观察者对象,使他们能够自动更新自己。

优点

1.观察者模式在被观察者和观察者之间建立一个抽象的耦合。

2.观察者模式支持广播通讯。被观察者会向所有的登记过的观察者发出通知。

缺点

1.如果一个被观察者对象有很多的直接和间接的观察者的话,将所有的观察者都通知到会花费很多时间。

2.如果在观察者和观察目标之间有循环依赖的话,观察目标会触发它们之间进行循环调用,可能导致系统崩溃。

3.观察者模式没有相应的机制让观察者知道所观察的目标对象是怎么发生变化的,而仅仅只是知道观察目标发生了变化。

结构图

  1. Subject:抽象主题(抽象被观察者),每个主题都可以有任意数量的观察者,抽象主题提供一个接口,可以增加和删除观察者对象。
  2. ConcreteSubject:具体主题(具体被观察者),把所有观察者对象保存在一个集合里,在具体主题的内部状态发生改变时,给所有注册过的观察者发送通知。
  3. Observer:抽象观察者,是观察者者的抽象类,它定义了一个更新接口,使得在得到主题更改通知时更新自己。
  4. ConcrereObserver:具体观察者,是实现抽象观察者定义的更新接口,以便在得到主题更改通知时更新自身的状态。

例子

java设计模式面试考点的更多相关文章

  1. Java岗 面试考点精讲(基础篇02期)

    1. 两个对象的hashCode相同,则equals也一定为true,对吗? 不对,答案见下面的代码: @Override public int hashCode() { return 1; } 两个 ...

  2. Java岗 面试考点精讲(基础篇01期)

    即将到来金三银四人才招聘的高峰期,渴望跳槽的朋友肯定跟我一样四处找以往的面试题,但又感觉找的又不完整,在这里我将把我所见到的题目做一总结,并尽力将答案术语化.标准化.预祝大家面试顺利. 术语会让你的面 ...

  3. java设计模式面试

    设计模式 1. 单例模式:饱汉.饿汉.以及饿汉中的延迟加载,双重检查 2. 工厂模式.装饰者模式.观察者模式. 3. 工厂方法模式的优点(低耦合.高内聚,开放封闭原则) 单例模式 分类:懒汉式单例.饿 ...

  4. Java岗 面试考点精讲(网络篇03期)

    1. OSI七层模型 总结一下: 应用用层按协议打包数据 由传输层加上双方的端口号 由网络层加上双方的IP地址 由链路层加上双方的MAC地址,并将数据拆分成数据帧 数模信号转换并由物理层传输到另一端 ...

  5. Java设计模式相关面试

    1.接口是什么?为什么要使用接口而不是直接使用具体类? 接口用于定义 API.它定义了类必须得遵循的规则.同时,它提供了一种抽象,因为客户端只使用接口,这样可以有多重实现,如 List 接口,你可以使 ...

  6. 我的阿里之路+Java面经考点

    我的阿里之路+Java面经考点 时间:2018-03-19 23:03  来源:未知   作者:admin   点击:87次 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三 ...

  7. JAVA设计模式(6:单例模式详解)

    单例模式作为一种创建型模式,在日常开发中用处极广,我们先来看一一段代码: // 构造函数 protected Calendar(TimeZone var1, Locale var2) { this.l ...

  8. 《设计模式面试小炒》策略和工厂模式替代业务场景中复杂的ifelse

    <设计模式面试小炒>策略和工厂模式替代业务场景中复杂的ifelse 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统, ...

  9. Java设计模式(十三) 别人再问你设计模式,叫他看这篇文章

    原创文章,转载请务注明出处 OOP三大基本特性 封装 封装,也就是把客观事物封装成抽象的类,并且类可以把自己的属性和方法只让可信的类操作,对不可信的进行信息隐藏. 继承 继承是指这样一种能力,它可以使 ...

随机推荐

  1. 使用RandomAccessFile类对文件进行读写

    1. RandomAccessFile类简介   前面一篇随笔<File类遍历目录及文件>中有说到,File类只能用于表示文件或目录的名称.大小等信息,而不能用于文件内容的访问.而当需要访 ...

  2. 核心J2EE模式 - 截取过滤器

    核心J2EE模式 - 截取过滤器 背景 呈现层请求处理机制接收许多不同类型的请求,这些请求需要不同类型的处理.一些请求被简单转发到适当的处理程序组件,而其他请求必须在进一步处理之前进行修改,审核或未压 ...

  3. HTML表单基本格式与代码

    咱们先来看下今天咱们需要学习的内容,理解起来很简单,像我这种英语不好的只是需要背几个单词 在HTML中创建表单需要用到的最基本的代码和格式 <form method="post/get ...

  4. JavaScript的XMLHttpRequest对象

    ajax的核心技术是XMLHttpRequest对象,简称XHR. //支持IE7及更高的版本 function createXML() { if(typeof XMLHttpReqquest!=&q ...

  5. 【转】JDBC学习笔记(5)——利用反射及JDBC元数据编写通用的查询方法

    转自:http://www.cnblogs.com/ysw-go/ JDBC元数据 1)DatabaseMetaData /** * 了解即可:DatabaseMetaData是描述数据库的元数据对象 ...

  6. CSAcademy Beta Round #3 a-game

    题目连接 a-game 大意:有一个只包含A和B的字符串,两个人分别取这个串的子串,但是每一次取不能与之前取到过的子串有交集,最后谁取到的所有串中A的总数量少的判为胜.如果一样,则为平手. 给出这样的 ...

  7. idea 查看tomcat源码

    一.源码下载 SVN :http://svn.apache.org/repos/asf/tomcat/ GIT :https://github.com/apache 二.添加pom.xml文件 1. ...

  8. myeclipse的class文件编译设置

    一,设置单个工程的class文件路径 右击工程,BulidPath——Configure Build Path

  9. SectionIndexer 利用系统的控件,制作比较美观的侧栏索引控件

    如上图所示,右侧的索引是系统提供的,具体使用方法,请搜索: SectionIndexer 相关的资料进行开发.

  10. springboot(十二):springboot如何测试打包部署

    有很多网友会时不时的问我,spring boot项目如何测试,如何部署,在生产中有什么好的部署方案吗?这篇文章就来介绍一下spring boot 如何开发.调试.打包到最后的投产上线. 开发阶段 单元 ...