前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >外观模式的介绍以及与适配器模式和装饰者模式的区别

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

作者头像
杨小杰
发布2019-07-04 16:28:59
3610
发布2019-07-04 16:28:59
举报
文章被收录于专栏:JAVA知识总结与分享

更多精彩,请点击上方蓝字关注我们!

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


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


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


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


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

代码简单举例:

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

代码语言:javascript
复制
 1package com.appearancePattern;
 2
 3/**
 4 * @program: test
 5 * @description: 应用商店
 6 * @author: Mr.Yang
 7 * @create: 2018-12-16 14:58
 8 **/
 9public class AppStore {
10    /**
11     * 查找应用
12     * @param userName 应用名称
13     */
14    public void findApp(String userName){
15        System.out.println("寻找应用名称 appName : "+userName);
16    }
17
18    /**
19     * 下载App
20     */
21    public void downLoadApp(){
22        System.out.println("下载app");
23    }
24}

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

代码语言:javascript
复制
 1package com.appearancePattern;
 2
 3/**
 4 * @program: test
 5 * @description: 微信方法封装类
 6 * @author: Mr.Yang
 7 * @create: 2018-12-16 14:54
 8 **/
 9public class Wechat {
10    /**
11     * 输入微信账号密码
12     * @param userName 微信账号
13     * @param passWord 微信密码
14     */
15    public void inputNamePass(String userName,String passWord){
16        System.out.println("输入账号密码:userName:"+userName+" 密码:"+passWord);
17    }
18
19    /**
20     * 点击登陆
21     */
22    public void clickLogin(){
23        System.out.println("点击登陆");
24    }
25
26    /**
27     * 查找用户
28     */
29    public  void findUser(String userName){
30        System.out.println("查找用户 userName : "+userName);
31    }
32
33    /**
34     * 发送消息
35     * @param message 消息内容
36     */
37    public void sendMessage(String message){
38        System.out.println("发送消息:message : "+message);
39    }
40
41}

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

代码语言:javascript
复制
 1package com.appearancePattern;
 2
 3/**
 4 * @program: test
 5 * @description: 外观封装类
 6 * @author: Mr.Yang
 7 * @create: 2018-12-16 15:01
 8 **/
 9public class AppearanceEnc {
10    AppStore appStore;
11    Wechat wechat;
12    public AppearanceEnc(AppStore appStore,Wechat wechat){
13        this.appStore=appStore;
14        this.wechat=wechat;
15    }
16
17    /**
18     * 组装发送消息的操作
19     */
20    public void encSendMessage(){
21        appStore.findApp("wechat");
22        appStore.downLoadApp();
23        wechat.inputNamePass("测试","123");
24        wechat.clickLogin();
25        wechat.findUser("小明");
26        wechat.sendMessage("在吗?借点钱");
27    }
28}

模拟调用方--测试

代码语言:javascript
复制
 1package com.appearancePattern;
 2
 3/**
 4 * @program: test
 5 * @description: 客户端测试类
 6 * @author: Mr.Yang
 7 * @create: 2018-12-16 15:04
 8 **/
 9public class Test {
10    /**
11     * 使用了外观模式,不仅提供了一个简化的接口访问,还可以进行单独的接口访问。
12     * 外观模式的特征:提供简化接口的同时,依然将系统完整的功能暴露出来,以共需要的程序使用
13     * @param args
14     */
15    public static void main(String[] args) {
16        AppStore appStore = new AppStore();
17        Wechat wechat = new Wechat();
18        AppearanceEnc appearanceEnc = new AppearanceEnc(appStore,wechat);
19        appearanceEnc.encSendMessage();
20    }
21/*
22    *//**
23     * 客户端测试,如果没有做一个统一方法的组合处理,客户端代码会变得很多。
24     * @param args
25     *//*
26    public static void main(String[] args) {
27        AppStore appStore = new AppStore();
28        Wechat wechat = new Wechat();
29        appStore.findApp("wechat");
30        appStore.downLoadApp();
31        wechat.inputNamePass("测试","123");
32        wechat.clickLogin();
33        wechat.findUser("小明");
34        wechat.sendMessage("在吗?借点钱");
35    }*/
36}

得到测试结果

代码语言:javascript
复制
1寻找应用名称 appName : wechat
2下载app
3输入账号密码:userName:测试 密码:123
4点击登陆
5查找用户 userName : 小明
6发送消息:message : 在吗?借点钱

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

知而好学,然后能才。

-----荀况

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA知识总结与分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 代码简单举例:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档