适配器和外观模式

结构型:Adapter与Facade(适配器和外观模式)  

  一般作为阅读材料,首先想要明确的是我现在了解的设计模式的初衷,即为了解决什么问题。

  适配器,如果有买过港版Iphone在内地使用的人应该会有三角大插头必须接一个转换器才能在一般的插座上使用的情况,当然这只是比较直观的感受。其实我们平时用的手机充电器都是属于适配器,试想如果我们没有这个充电器,我们如何利用普通插座给手机充电?

  适配器的定义:将手头上所持有的接口转换成我们需要的接口(业务场景:经常是为了适配旧程序或者对接2套系统的时候使用,当你无法使你的对接系统做修改的时候,往往需要我们自己做适配。)

  适配器的结构:

    目标对象-target

    被适配者-adapted

    适配器-adapter

  demo:

  

package top.gabin.oa.web.design.adapter;/*** 想办法** @author linjiabin on  16/5/5*/
public interface Think {String idea();
}

 

 

package top.gabin.oa.web.design.adapter;/*** 土英语:诸葛亮** @author linjiabin on  16/5/5*/
public class VariousGeBright implements Think {@Overridepublic String idea() {return "草船借箭";}
}

 

package top.gabin.oa.web.design.adapter;/*** 补鞋匠* @author linjiabin on  16/5/5*/
public class Cobbler implements Think {private static int count = 0;@Overridepublic String idea() {if (count > 0 && count % 10 == 0) {return "草船借箭";}System.out.println("我想不到");count++;return null;}
}

 

package top.gabin.oa.web.design.adapter;/*** 伪装成聪明人的适配器* @author linjiabin on  16/5/5*/
public class SmartAdapter extends VariousGeBright {private Cobbler cobbler;public SmartAdapter(Cobbler cobbler) {this.cobbler = cobbler;}@Overridepublic String idea() {String idea = null;while ((idea = cobbler.idea()) == null) {}return idea;}
}
package top.gabin.oa.web.design.adapter;import org.junit.Test;/*** 测试适配器的效果** @author linjiabin on  16/5/5*/
public class TestAdapter {@Testpublic void testAdapter() {Cobbler cobbler = new Cobbler();VariousGeBright variousGeBright = new SmartAdapter(cobbler);String idea = variousGeBright.idea();System.out.println(idea);}}

 

输出结果:

我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
我想不到
草船借箭

 

  这个例子是想借鉴三个臭皮匠赛过诸葛亮的寓意,我通过适配器将一个补鞋匠伪装成一个诸葛亮,实际上诸葛亮只需要思考一次就能想到好主意,而补鞋匠需要10次之后才能想到。实际上适配器就是一个伪装面具,当然你也可以把他当做是一种易容术。

 

  外观模式:我们可以把它理解成一个public方法下面调用了好几个private方法。我承认这种语言只有程序员懂,那我们可以换一种方式沟通:这其实有点像宏命令,说白了,其实这是一组命令,而不是一个命令。在生活场景中,我前几天就有遇到一个,刚好跟大家分享一下。我们家有一个空调遥控器,上面只有5、6个按钮,大致是电源、制冷、辅热这样的,我一想,这功能也太少了吧,于是我扒了遥控器,发现里面还有另外一组按钮,只是外层的按钮【比较大】,因为外层按钮包裹了内层的2个按钮。

  其实外观模式在类上面相当简单,其目的也仅仅是提供一个高级入口,隐藏子系统接口的调用。

  大概是这样子:

    ---------------------------------

    | FacadeInterface      |

    |  -SubSystemInterface |

    |  -SubSystemInterface  |

    |------------------------------- |

    |  +seniorEntrance()    |

    ----------------------------------

    SubSystemInterface

 

  seniorEntrance方法调用了私有的SubSystemInterface实现对象的各种方法,但这并不需要告诉你,你只需要只有有这么一个接口就好了。

 

 

    

转载于:https://www.cnblogs.com/gabin/p/5457130.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

js获取cookie获取不到问题 vue获取cookie以及获取不到问题

1.下载依赖包 npm i js-cookie -S2.在使用cookie的页面上进行引入 import Cookies from js-cookie3.使用 创建一个在整个网站上有效的CookieCookies.set(name, value);创建一个从现在起7天后过期的cookie,在整个站点上有效:Cookies.set(name, value, …

smarty二维foreach示例[顺代一维数组],再次加强版

2019独角兽企业重金招聘Python工程师标准>>> smarty二维foreach示例[顺代一维数组],再次加强版 WEB2.0 root 2009-4-9 10:46 评论(0) 阅读(682) 大 | 中 | 小 WEB2.0 | 评论(0) | 引用(0) | 阅读(682) view plain print ? {foreach itemrec from$result…

linux 函数学习--kzalloc()

使用include <linux/slab.h>void *kmalloc(size_t size, int flags);static inline void *kzalloc(size_t size, gfp_t flags) { return kmalloc(size, flags | __GFP_ZERO); } 123456说明给 kmalloc 的第一个参数是要分配的块的大小. 第 2 个参数, 分配标志 用kza…

动态链接库和静态链接库

From: http://blog.163.com/zhangjie_0303/blog/static/99082706201081105654484/ 动态链接库dll&#xff0c;静态链接库lib, 导入库lib 目前以lib后缀的库有两种&#xff0c;一种为静态链接库(Static Libary&#xff0c;以下简称“静态库”)&#xff0c;另一种为动态连接库(…

div与div区别小结

两者之间的区别:例如div span得到的是div下所有的span元素&#xff0c;而div>span则是取得的div下第一级的span元素。 示例代码如下&#xff1a; <!DOCTYPE html><html lang"en" xmlns"http://www.w3.org/1999/xhtml"> <head><met…

url的特殊字符编码 encodeURI编码

参考&#xff1a; 编码解码 前沿&#xff1a; 例如上传资源视频图片&#xff0c;针对一些特殊的字符&#xff01;#&#xffe5;%……&*&#xff08;&#xff09;&#xff1f;《{[,./’~ 不做转码的时候url识别会错&#xff0c;图片就不会显示出来&#xff0c;这时候就需要对…

Linux设备驱动之Kobject、Kset

LDD3中说&#xff0c;Kobject的作用为&#xff1a;1、sysfs 表述&#xff1a;在 sysfs 中出现的每个对象都对应一个 kobject, 它和内核交互来创建它的可见表述。2、热插拔事件处理 &#xff1a;kobject 子系统将产生的热插拔事件通知用户空间。 3、数据结构关联&#xff1a;…

40个新鲜出炉的 jQuery 插件和免费教程【上篇】 转载自:梦想天空

40个新鲜出炉的 jQuery 插件和免费教程【上篇】 转载于:https://www.cnblogs.com/chenjunLovefan/archive/2012/07/23/2605003.html

vector, list, map在遍历时删除符合条件的元素

直接看源码&#xff0c;内有详细解释 /*测试vector, list, map遍历时删除符合条件的元素本代码测试环境: ubuntu12 win7_x64*/#include <iostream>#include <vector>#include <list>#include <map>#include <iterator>using namespace std;void…

图片不显示问题 图片url监测改变问题

问题&#xff1a;点击按钮换一换的时候&#xff0c;后台返回的三张小图片的地址还是原来的地址&#xff0c;但是三张小图确实是变了&#xff1b;这时候如果一开始头图是图3&#xff0c;点击换一换后&#xff0c;三张小图变了&#xff0c;此时还是想选择图3为头图&#xff1b;却…

linux设备:cdev和kobj_map

先看kobj_map相关的代码涉及到的文件<linux/kobj_map.h><drivers/base/map.c>[objc] view plaincopyprint?typedef struct kobject *kobj_probe_t(dev_t, intint *, voidvoid *); struct kobj_map; int kobj_map(struct kobj_map *, dev_t, unsigned long, stru…

限定虚拟机可用的CPU利用率

Windows Server 2012姗姗来迟&#xff0c;最新的Hyper-V 3给我们带来更多的惊喜&#xff0c;后续三篇博文和大家共同学习虚拟机CPU竞争机制。 第一部分&#xff1a;分配给虚拟机的CPU资源 第二部分&#xff1a;限定虚拟机可用的CPU利用率 第三部分&#xff1a;争夺CPU资源优先级…

Windows 7 文件夹共享

今天搞了下windows 7下的文件共享&#xff0c;总是搞不定&#xff0c;虽然以前也偶尔有成功过&#xff0c;但未作记录&#xff0c;现在要搞一时搞不定&#xff0c;所以决定好好记录一下。 win7的文件夹共享搞得实在是太麻烦了(对于一般用户而言)&#xff0c;为了权限控制&#…

MYSQL学习笔记 (二)对数据库结构的增删改查

显示数据库 show databases; 选择数据库 use database;//其实database为数据库的名字 创建表 create table tbclass( id int not null auto_increment primary key, className varchar(20) not null unique, studentNum smallint not null )enginemyisam default charsetutf8 插…

将二进制文件bold转化为文件file

参考&#xff1a;bold和file互相转换 let files new window.File([this.blob], file.name, {type: file.type}) File()构造函数的前两个参数为必传

1.the linux device model--kobject kset学习笔记

http://blog.chinaunix.net/uid-22547469-id-4590385.html?utm_sourcejiancool Linux设备模型就是一栋规模宏大的建筑&#xff0c;为了构建它&#xff0c;需要基本的建筑材料钢筋&#xff1a;kobject、若干钢筋组成的钢架结构&#xff1a;kset&#xff0c;还需要一种机制sysfs…

带格式化参数的strcat宏定义

#include <stdio.h>#include <iostream>#include <string.h>using namespace std;// 带格式化参数的strcat宏定义#define Strcat(x, fmt, ...) sprintf(x, "%s" #fmt, x, __VA_ARGS__)int main(void){char buf[200];for(int k 0; k < 4; k){me…

微信公众号开发笔记1-获取Access Token

获取你的Access Token a&#xff09;可以采用网址的形式&#xff1a; 用appid和appsecert获得access token&#xff0c;接口为https://api.weixin.qq.com/cgi-bin/token?grant_typeclient_credential&appid你的APPID&secret你的APPSECRET 替换中间的你的APPID和APPSEC…

mii-tool与ethtool的用法详解

From: http://blog.chinaunix.net/uid-20639775-id-154546.html 1、mii-tool 配置网络设备协商方式的工具&#xff1b; 感谢原文作者&#xff01;原文地址&#xff1a;http://ygning.blog.com.cn/archives/2007/2153373.shtml 1.1 mii-tool 介绍&#xff1b; mii-tool - v…

linux学习wdlinux学堂

wdlinux学堂是什么?wdlinux学堂是一个学习Linux系统的学习计划,主要是linux系统的使用,服务器配置,架构,维护,优化,运维等等以wdOS系统为例做讲解,通过一些通俗的语言,结合自己的一些经验,来写一些教程或文档抛开书本的长篇大论,更多注重实践与操作每周五天,每天至少一课/一个…