Java设计模式的代码演示(结构型模式一)
目录
- 写在前面
- 一、适配器模式
- 1.1. 类适配器模式
- 1.2. 对象适配器模式
- 二、桥接模式
- 三、装饰器模式
写在前面
上一篇我们学习了创建型设计模式
本篇文章通过代码演示的形式,记录结构型设计模式的相关学习总结,包括:适配器模式、桥接模式和装饰器模式
详细内容可参考 Java设计模式、图说设计模式
一、适配器模式
适配器模式的目的是使接口不兼容的类能够一起工作;其中包含三个角色
- 目标接口:当前系统业务所期待的接口,它可以是抽象类或接口
- 适配者:它是被访问和适配的现存组件库中的组件接口
- 适配器:它是一个转换器,通过继承或引用适配者的对象,把适配者接口转换成目标接口,让客户按目标接口的格式访问适配者
1.1. 类适配器模式
/*** 目标:使用电插座*/
public interface ElecSocket {//充电void recharge();
}/*** 适配者*/
public class SocketAdaptee {public void socketTransform() {System.out.println("已转换为当前可用接口,开始充电");}
}/*** 低电压插座*/
public class LowPowerAdapter extends SocketAdaptee implements ElecSocket {@Overridepublic void recharge() {System.out.println("使用低电压插座");socketTransform();}
}/*** 高电压插座*/
public class HighPowerAdapter extends SocketAdaptee implements ElecSocket {@Overridepublic void recharge() {System.out.println("使用高电压插座");socketTransform();}
}/*** 用户*/
public class Client {public static void main(String[] args) {System.out.println("需要充电");ElecSocket socket1 = new LowPowerAdapter();socket1.recharge();ElecSocket socket2 = new HighPowerAdapter();socket2.recharge();}
}
1.2. 对象适配器模式
/*** 目标:使用电插座*/
public interface ElecSocket {//充电void recharge();
}/*** 适配者*/
public class SocketAdaptee {public void socketTransform() {System.out.println("已转换为当前可用接口,开始充电");}
}/*** 低电压插座*/
public class LowPowerAdapter implements ElecSocket {private SocketAdaptee mAdaptee;public LowPowerAdapter(SocketAdaptee adaptee) {mAdaptee = adaptee;}@Overridepublic void recharge() {System.out.println("使用低电压插座");mAdaptee.socketTransform();}
}/*** 高电压插座*/
public class HighPowerAdapter implements ElecSocket {private SocketAdaptee mAdaptee;public HighPowerAdapter(SocketAdaptee adaptee) {this.mAdaptee = adaptee;}@Overridepublic void recharge() {System.out.println("使用高电压插座");mAdaptee.socketTransform();}
}/*** 用户*/
public class Client {public static void main(String[] args) {System.out.println("需要充电");SocketAdaptee adaptee = new SocketAdaptee();ElecSocket socket1 = new LowPowerAdapter(adaptee);socket1.recharge();ElecSocket socket2 = new HighPowerAdapter(adaptee);socket2.recharge();}
}
二、桥接模式
桥接模式通过分离一个抽象接口和它的实现部分,使得设计可以按两个维度独立扩展。
描述听起来很抽象,我们举个简单的例子:
我们玩游戏经常会要创建角色,角色有不同的种族、职业等属性,假设种族包括人族、精灵,职业包括战士、魔法师,那么我们就能够创造四个不同的职业(2 * 2,不一一列举)。如果通过普通继承的方式,我们需要创建4个子类来分别表示它们,如果属性更多,那么子类的数量会非常庞大。
换一个思路,如果我们只需要创建基础角色,为角色赋予各种属性,是不是就可以更简单呢?
我们以职业为基础维度,为每个职业赋予种族属性
//职业抽象类,包含种族属性
public abstract class Profession {Ethnicity mEthnicity;public Profession(Ethnicity mEthnicity) {this.mEthnicity = mEthnicity;}public abstract void createProfession();
}//魔法师
public class Magician extends Profession {public Magician(Ethnicity mEthnicity) {super(mEthnicity);}@Overridepublic void createProfession() {System.out.println("Create Magician, Ethnicity is " + mEthnicity.createEthnicity());}
}//战士
public class Warrior extends Profession {public Warrior(Ethnicity mEthnicity) {super(mEthnicity);}@Overridepublic void createProfession() {System.out.println("Create Warrior, Ethnicity is " + mEthnicity.createEthnicity());}
}
定义好了职业,我们再来定义种族属性。
//种族类型接口
public interface Ethnicity {String createEthnicity();
}//人类
public class Human implements Ethnicity {@Overridepublic String createEthnicity() {return "Human";}
}//精灵
public class Elf implements Ethnicity {@Overridepublic String createEthnicity() {return "Elf";}
}
定义好之后,我们在创建的时候,只需要给每个职业赋予种族属性即可得到对应的角色。
public class Player {public static void main(String[] args) {Ethnicity elf = new Elf();Ethnicity human = new Human();Profession player1 = new Warrior(human);Profession player2 = new Magician(human);Profession player3 = new Warrior(elf);Profession player4 = new Magician(elf);player1.createProfession();player2.createProfession();player3.createProfession();player4.createProfession();}
}
这样,4个玩家就创建了4种角色
Create Warrior, Ethnicity is Human
Create Magician, Ethnicity is Human
Create Warrior, Ethnicity is Elf
Create Magician, Ethnicity is Elf
当职业或种族的类型更多时,使用桥接模式,可以避免创建数量庞大的子类,使我们的代码结构更加清晰简洁。
三、装饰器模式
装饰器模式的作用是:在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)。
这个相比桥接模式更容易理解,我们还是举个例子来说明。
路飞刚开始只有橡胶果实一项能力
public interface Luffy {void skill();
}//普通路飞
public class OriginalLuffy implements Luffy {private String mSpecialSkill;@Overridepublic void skill() {System.out.println("基础能力:橡胶果实");}
}
后期通过训练学会了新技能
//抽象角色
public class SpecialSkills implements Luffy {Luffy mOriginalLuffy;public SpecialSkills(Luffy mOriginalLuffy) {this.mOriginalLuffy = mOriginalLuffy;}@Overridepublic void skill() {mOriginalLuffy.skill();}
}//新技能:霸气
public class Haki extends SpecialSkills {public Haki(Luffy mOriginalLuffy) {super(mOriginalLuffy);}@Overridepublic void skill() {super.skill();setHaki();}public void setHaki() {System.out.println("增加特殊能力");System.out.println("特殊能力:霸王色霸气、武装色霸气、见闻色霸气");}
}public class LuffyIntroduce {public static void main(String[] args) {Luffy luffy1 = new OriginalLuffy();luffy1.skill();System.out.println("-----------使用装饰器----------");Luffy luffy2 = new Haki(luffy1);luffy2.skill();}
}
基础能力:橡胶果实
-----------使用装饰器----------
基础能力:橡胶果实
增加特殊能力
特殊能力:霸王色霸气、武装色霸气、见闻色霸气
这样我们就在不改变原本类结构的情况下,增加了新的功能。
Java设计模式的代码演示(结构型模式一)相关推荐
- Java设计模式笔记——七个结构型模式
系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...
- java设计模式(2) - 结构型模式
1.适配器模式 将一个类的接口转成用户想要用的一种接口,适配器模式将一种接口兼容不能一起工作的那个类可以一起工作. 适用:1.想使用一个类,但是它的接口不符合:2.想创建一个可以复用的类,该类可以与不 ...
- 设计模式(三)结构型模式介绍及实例
文章目录 一.适配器模式 1.1 适配器模式定义 1.2 适配器模式主要角色 1.3 适配器模式特点 1.4 适配器模式实现方式 1.4.1 类适配器模式 1.4.2 对象适配器模式 1.5 适配器模 ...
- java面试题31:结构型模式中最体现扩展性的模式是()
java面试题31:结构型模式中最体现扩展性的模式是() A:装饰模式 B:合成模式 C:桥接模式 D:适配器 蒙蔽树上蒙蔽果,蒙蔽树下你和我 结构型模式是描述如何将类对象结合在一起,形成一个更大的结 ...
- 代码精进之路-设计模式-(二)结构型模式
二.结构型模式(7个) 1.适配器模式 //针对的是已经存在的组件或者系统,而你也有自己的接口规范,你不想去依赖对方的接口, //这时候用适配器模式比较合适,用自己接口的一个实现去依赖对方的接口并做兼 ...
- 《设计模式详解》结构型模式 - 适配器模式
适配器模式 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 接口适配器模式 5.2.6 应用场景 5.2.7 JDK 源码 - ...
- 《设计模式详解》结构型模式 - 代理模式
代理模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 动态代理 JDK 动态代理 JDK 动态代理分析 CGLIB 动态代理 5.1.5 三种代理的对比 5 ...
- JAVA设计模式第三讲:结构型设计模式
设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...
- 设计模式(2)结构型模式
结构型模式 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效. 结构型模式: 适配器模式:用来把一个接口转化成另一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以在一 ...
- 设计模式(四)结构型模式
前言 结构型设计模式,主要研究: 主要有哪些场景使用结构型设计模式: 每种场景应该使用何种设计模式: 以程序中的功能为核心,研究程序功能的组织结构.所以这一章,我们要把"功能结构" ...
最新文章
- springboot 线程池_Spring boot 2 线程池怎么配置
- PyCharm安装mysqlclient一直提示MS Visual C++ 14 required
- ORCLE 表中列的修改(非常全面哦)
- MATLAB 图像处理函数(第六章)(获取图像矩形像素的运用)
- Python正则表达式-常用函数的基本使用
- Codeforces 1480B. The Great Hero(阅读模拟题,注意数据范围和攻击顺序)
- gps天线拆解图片_华为 畅享 Z 拆解:揭秘千元5G手机物料成本是多少
- 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
- ZOJ2930 The Worst Schedule(最小割)
- TCPDUMP/LIBPCAP 3-PCAP 中文手册(1)
- 看完少年的你,想到少年的我
- 【数学建模】基于matlab GUI停车场仿真系统【含Matlab源码 1046期】
- redhat5.4上安装oracle9i
- MSChart控件在对话框程序(vc2010 MFC)中的错误怎么解决?
- S3C2440 蜂鸣器 汇编语言,S3C2440的基础功能模块实现过程
- Delphi10.3.3 部署android 开发环境
- 在android tegra2中添加一个camera
- IPAD DHCP
- 【再也不怕pdf转换了】使用Python实现PDF扫描件生成DOCX或EXCEL
- 对计算的理解计算机科学导论论文,计算机科学导论论文
热门文章
- mysql单表、多表查询
- Lora无线终端工作原理及优缺点
- mysql脚本自动拉起_shell脚本自动拉起启动程序
- 判了!40岁程序员被判7年,曾提出系统安全问题被无视,怒删9TB财务数据及系统数据!...
- SVN 小乌龟 提交项目时过滤target文件或者文件下的代码
- IDEA使用svn进行代码分支合并
- 史上最萌挑战现身海天蚝油《挑战不可能之加油中国》
- 百度由来之众里寻他千百度
- 【译文】KKR与CDR53亿美元收购Cloudera影响
- “我学习win32com的秘诀”,本周六(7月1日)上午腾讯会议室见