外观模式的介绍以及与适配器模式和装饰者模式的区别

外观模式
定义:提供了一个统一的接口,用来访问子系统中的一群接口,外观定义了一个高层接口,让子系统更容易使用。

举例:我需要打开微信发送给某个好友某些内容,其中的过程包括了,下载微信,输入账号密码,点击登陆,找到好友,发送消息。这些整体封装成了一个对外的方法,当我调用需要这个流程的时候,我通过一个方法的调用,直接就能实现全部的流程,不需要在请求方,去组合方法去完成这个操作。

设计原则:莫忒耳原则又称最少知识原则,只和你的密友谈话,通过“举例”,可以明白这个原则的定义。

原则缺点:采用这个原则会导致更多的”包装“对象被制造出来,以处理和其他组件的沟通,可能会导致复杂度和开发时间的增加,降低运行时性能

设计模式比较:外观模式,适配器模式,装饰者模式
适配器模式:当需要使用一个现有的类,但是接口并不符合要求,考虑使用适配器模式。将一个对象包装起来改变接口。
外观模式:当需要简化并统一一个/一群很大的接口的时候,考虑使用外观模式。依托与子系统执行。
装饰着模式:将一个对象包装起来,增加新的行为和责任。
代码简单举例:

创建一个APPSotre的对象,来描述在APPStore内的操作

package com.appearancePattern;

/**
 * @program: test
 * @description: 应用商店
 * @author: Mr.Yang
 * @create: 2018-12-16 14:58
 **/
public class AppStore {
    /**
     * 查找应用
     * @param userName 应用名称
     */
    public void findApp(String userName){
        System.out.println("寻找应用名称 appName : "+userName);
    }

    /**
     * 下载App
     */
    public void downLoadApp(){
        System.out.println("下载app");
    }
}
 

创建一个Wechat的对象,来描述在Wechat内的操作

package com.appearancePattern;

/**
 * @program: test
 * @description: 微信方法封装类
 * @author: Mr.Yang
 * @create: 2018-12-16 14:54
 **/
public class Wechat {
    /**
     * 输入微信账号密码
     * @param userName 微信账号
     * @param passWord 微信密码
     */
    public void inputNamePass(String userName,String passWord){
        System.out.println("输入账号密码:userName:"+userName+" 密码:"+passWord);
    }

    /**
     * 点击登陆
     */
    public void clickLogin(){
        System.out.println("点击登陆");
    }

    /**
     * 查找用户
     */
    public  void findUser(String userName){
        System.out.println("查找用户 userName : "+userName);
    }

    /**
     * 发送消息
     * @param message 消息内容
     */
    public void sendMessage(String message){
        System.out.println("发送消息:message : "+message);
    }

}
 

利用统一组装方法做个修饰,对外暴露一个完整功能-外观模式

package com.appearancePattern;

/**
 * @program: test
 * @description: 外观封装类
 * @author: Mr.Yang
 * @create: 2018-12-16 15:01
 **/
public class AppearanceEnc {
    AppStore appStore;
    Wechat wechat;
    public AppearanceEnc(AppStore appStore,Wechat wechat){
        this.appStore=appStore;
        this.wechat=wechat;
    }

    /**
     * 组装发送消息的操作
     */
    public void encSendMessage(){
        appStore.findApp("wechat");
        appStore.downLoadApp();
        wechat.inputNamePass("测试","123");
        wechat.clickLogin();
        wechat.findUser("小明");
        wechat.sendMessage("在吗?借点钱");
    }
}
 

模拟调用方--测试

package com.appearancePattern;

/**
 * @program: test
 * @description: 客户端测试类
 * @author: Mr.Yang
 * @create: 2018-12-16 15:04
 **/
public class Test {
    /**
     * 使用了外观模式,不仅提供了一个简化的接口访问,还可以进行单独的接口访问。
     * 外观模式的特征:提供简化接口的同时,依然将系统完整的功能暴露出来,以共需要的程序使用
     * @param args
     */
    public static void main(String[] args) {
        AppStore appStore = new AppStore();
        Wechat wechat = new Wechat();
        AppearanceEnc appearanceEnc = new AppearanceEnc(appStore,wechat);
        appearanceEnc.encSendMessage();
    }
/*
    *//**
     * 客户端测试,如果没有做一个统一方法的组合处理,客户端代码会变得很多。
     * @param args
     *//*
    public static void main(String[] args) {
        AppStore appStore = new AppStore();
        Wechat wechat = new Wechat();
        appStore.findApp("wechat");
        appStore.downLoadApp();
        wechat.inputNamePass("测试","123");
        wechat.clickLogin();
        wechat.findUser("小明");
        wechat.sendMessage("在吗?借点钱");
    }*/
}
 

得到测试结果:

寻找应用名称 appName : wechat
下载app
输入账号密码:userName:测试 密码:123
点击登陆
查找用户 userName : 小明
发送消息:message : 在吗?借点钱
 

外观模式总结:

外观模式允许从客户实现从子系统中解耦,比如:微信多了个登陆验证功能,我们只需要改变外观的代码就能实现,客户代码是针对于外观模式的,而不是针对自己系统来做的操作。

                              

                              知而好学,然后能才。

                                                                      -----荀况

原文地址:https://www.cnblogs.com/yangxiaojie/p/10126843.html

时间: 2024-11-09 03:08:18

外观模式的介绍以及与适配器模式和装饰者模式的区别的相关文章

适配器模式和装饰者模式的区别

适配器模式将一个类的接口,转化成客户期望的另一个接口,适配器让原本接口不兼容的类可以合作无间. 装饰者模式:动态的将责任附加到对象上(因为利用组合而不是继承来实现,而组合是可以在运行时进行随机组合的).若要扩展功能,装饰者提供了比继承更富有弹性的替代方案(同样地,通过组合可以很好的避免类暴涨,也规避了继承中的子类必须无条件继承父类所有属性的弊端). 特点: 1. 装饰者和被装饰者拥有相同的超类型(可能是抽象类也可能是接口) 2. 可以用多个装饰类来包装一个对象,装饰类可以包装装饰类或被装饰对象

适配器模式 vs 装饰者模式

Reference [1] https://refactoring.guru/design-patterns/adapter 1. Adaptor Design Pattern 适配器模式 Adapter is a structural design pattern, which allows incompatible objects to collaborate. You can create an adapter. This is a special object that converts

09.设计模式_装饰者模式

转载自   http://www.cnblogs.com/zhili/p/DecoratorPattern.html 一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现的话,就需要定义无数的类,如StickerPhone(贴膜是手机类).AccessoriesPhone(挂件手机类)等,这样就会导致 "子类爆炸"问题,为了解决这个问题,我们可以使用装饰者模式来动态地给一个对象添加额外的职责.下面让我们看看装饰

装饰者模式(Decorator Pattern)C#版本的

仍然来自 zhili https://www.cnblogs.com/zhili/p/DecoratorPattern.html 谢谢啊 呵呵 ---------------------------------------------------- 分割线 -------------------------------------------------------- 一.引言 在软件开发中,我们经常想要对一类对象添加不同的功能,例如要给手机添加贴膜,手机挂件,手机外壳等,如果此时利用继承来实现

Java设计模式之工厂模式(Factory模式)介绍(转载)

原文见:http://www.jb51.net/article/62068.htm 这篇文章主要介绍了Java设计模式之工厂模式(Factory模式)介绍,本文讲解了为何使用工厂模式.工厂方法.抽象工厂.Java工厂模式举例等内容,需要的朋友可以参考下 工厂模式定义:提供创建对象的接口. 为何使用工厂模式 工厂模式是我们最常用的模式了,著名的Jive论坛,就大量使用了工厂模式,工厂模式在Java程序系统可以说是随处可见. 为什么工厂模式是如此常用?因为工厂模式就相当于创建实例对象的new,我们经

Android设计模式之中的一个个样例让你彻底明确装饰者模式(Decorator Pattern)

导读 这篇文章中我不会使用概念性文字来说明装饰者模式.由于通常概念性的问题都非常抽象.非常难懂.使得读者非常难明确究竟为什么要使用这样的设计模式.我们设计模式的诞生,肯定是前辈们在设计程序的时候遇到了某种困难,为了避免这样的苦难的发生,从而设计出来的这样的设计模式,所以这篇文章中我会带领大家遇见这样的困难,从而使用设计模式解决这样的困难,最后大家就会明确什么是设计者模式,什么时候应该使用设计者模式以及怎样使用设计者模式了 首先我们先来看一下装饰者模式的UML图是什么样子的.图中各个类的含义不懂没

设计模式(十):装饰者模式

在<JavaScript设计模式>介绍中,装饰者模式跟Mixin(混入)模式相比,是另一种可行的对象子类化(Mixin模式干的事)的替代方案. 装饰者(Decorator)模式 定义: 给对象动态添加额外的功能.向基本对象添加(装饰)属性或方法,而不是进行子类化,它较为精简. 使用场景: java IO 流是典型的装饰模式. PS:应用程序包含需要大量不同类型对象的功能. 例子: // The constructor to decorate function MacBook() { this.

java/android 设计模式学习笔记(7)---装饰者模式

这篇将会介绍装饰者模式(Decorator Pattern),装饰者模式也称为包装模式(Wrapper Pattern),结构型模式之一,其使用一种对客户端透明的方式来动态的扩展对象的功能,同时它也是继承关系的一种替代方案之一,但比继承更加灵活.在现实生活中也可以看到很多装饰者模式的例子,或者可以大胆的说装饰者模式无处不在,就拿一件东西来说,可以给它披上无数层不一样的外壳,但是这件东西还是这件东西,外壳不过是用来扩展这个东西的功能而已,这就是装饰者模式,装饰者的这个角色也许各不相同但是被装饰的对

java设计模式------装饰着模式

java设计模式-------装饰者模式 装饰者模式 Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案.主要有组件(components)和装饰器(Decorator)组成.要求components和Decorator实现相同的接口或者抽象类(具体类的局限性太大). 设计原则.模式特点.适用性 - 1. 多用组合,少用继承. 利用继承设计子类的行为,是在编译时静态决定的,而且所有的子类都会继承到相同的行为.然而,如果能够利用