设计模式与代码的结构特性
时间:2019-12-07
本文章向大家介绍设计模式与代码的结构特性,主要包括设计模式与代码的结构特性使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
适配器模式
日常生活中的标准电压为220V,而我们所使用的电器的电压确实各种各样的,因此,当为它们充电时就需要使用相应地充电器在和标准电压和电器电压之间进行转换,这里充电器的作用就相当于一个适配器。
而在编程设计中,适配器模式是将一个类的接口转换成客户期望的接口。接下来以具体的实例对适配器进行介绍。
分类
对象适配器
通过对象组合的方式来进行处理的,而不是通过继承的方式,组合相比继承是更推荐的方式。类适配器
通过类继承的方式来实现,和对象适配器相比类适配器的依赖性更大,并且随着继承膨胀变得难以控制,灵活性得不到保障。
实例
教师的工作是教书(teach()),学生的工作是学习(study()),程序员的工作是编程(program()),不同的行业有不同的工作形式,现在希望编写一个程序输出表示不同行业的工作形式。
1. 不使用适配器模式
//教师行业接口 public interface ITeacher { String teach(); } //教师行业实现 public class Teacher implements ITeacher{ public String teach() { return "教书"; } } //程序员行业接口 public interface IProgrammer { String program(); } //程序员行业实现 public class Student implements IProgrammer{ public String program() { return "编程"; } }
2. 定义适配器模式
//统一的接口 public interface IWorker { //worker的类型以Object代替,以适配各种类型 String work(Object worker); boolean Support(Object worker); } //教师的适配器 public class Teacher implements IWorker{ public String work(Object obj){ return ((ITeacher)obj).teach(); } public boolean Support(Object worker){ return worker instanceof ITeacher; } } //程序员的适配器 public class Programmer implements IWorker{ public String work(Object obj){ return ((IProgrammer)obj).program(); } public boolean Support(Object worker){ return worker instanceof IProgrammer; } }
总结
1.适配器模式优点
将目标类和适配器类解耦,通过引入一个适配器类来复用现有的适配器类,而无须修改原代码。
- 提高了类的复用,增加了类的透明度,将具体实现封装在适配器类中,对目标类来说是透明的。
使编程更具灵活性和可扩展性,可以很方便地更换适配器,也可以快速地增加新的适配器类。
2.适配器模式缺点
过多地使用适配器,会让系统变得非常零乱,不易从整体进行把握。
参考: https://www.cnblogs.com/yuxiang1/p/11058678.html
原文地址:https://www.cnblogs.com/minhui/p/12001908.html
- 2017 Multi-University Training Contest - Team 9 1001&&HDU 6161 Big binary tree【树形dp+hash】
- 【Java学习笔记之三十三】详解Java中try,catch,finally的用法及分析
- 【Java学习笔记之二十九】Java中的"equals"和"=="的用法及区别
- NET跨平台:在Ubuntu下搭建ASP.NET 5开发环境
- 【Code】关关的刷题日记22——Leetcode 53. Maximum Subarray
- 【Java学习笔记之三十四】超详解Java多线程基础
- Codeforces 842B Gleb And Pizza【几何,水】
- Python3希尔排序
- Codeforces 842A Kirill And The Game【暴力,水】
- Wannafly模拟赛 A.矩阵(二分答案+hash)
- 【Java数据结构学习笔记之一】线性表的存储结构及其代码实现
- Comparison of Apache Stream Processing Frameworks: Part 1
- 【LeetCode】关关的刷题日记23——Leetcode 66. Plus One
- Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861A k-roun
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- nginx反向代理与负载均衡
- APP | edxposed框架+trustmealredy模块抓包小程序
- nginx动态添加模块
- 曾经豪言“指哪爬哪”,如今被一个JS狠狠教做人
- mysql主从复制延迟问题记录
- linux下设置locale
- 宜信OCR技术探索与实践|直播速记
- keepalived结合lvs实现双机热备
- jenkins安装说明
- Haproxy combined with FTP cluster for load balancing
- redis使用playbook批量安装
- SpringCloud Alibaba微服务实战十八 - Oauth2.0 自定义授权模式
- 包子旧闻&Leetcode solution 1344. Angle Between Hands of a Clock
- Ubuntu下DNS服务搭建
- 深入理解JavaScript函数式编程