目录

  • 写在前面
  • 一、适配器模式
    • 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设计模式的代码演示(结构型模式一)相关推荐

  1. Java设计模式笔记——七个结构型模式

    系列文章目录 第一章 Java设计模式笔记--七大设计原则 第二章 Java设计模式笔记--六个创建型模式 文章目录 系列文章目录 一.适配器模式 1.概念 2.类适配器 3.对象适配 4.缺省适配器 ...

  2. java设计模式(2) - 结构型模式

    1.适配器模式 将一个类的接口转成用户想要用的一种接口,适配器模式将一种接口兼容不能一起工作的那个类可以一起工作. 适用:1.想使用一个类,但是它的接口不符合:2.想创建一个可以复用的类,该类可以与不 ...

  3. 设计模式(三)结构型模式介绍及实例

    文章目录 一.适配器模式 1.1 适配器模式定义 1.2 适配器模式主要角色 1.3 适配器模式特点 1.4 适配器模式实现方式 1.4.1 类适配器模式 1.4.2 对象适配器模式 1.5 适配器模 ...

  4. java面试题31:结构型模式中最体现扩展性的模式是()

    java面试题31:结构型模式中最体现扩展性的模式是() A:装饰模式 B:合成模式 C:桥接模式 D:适配器 蒙蔽树上蒙蔽果,蒙蔽树下你和我 结构型模式是描述如何将类对象结合在一起,形成一个更大的结 ...

  5. 代码精进之路-设计模式-(二)结构型模式

    二.结构型模式(7个) 1.适配器模式 //针对的是已经存在的组件或者系统,而你也有自己的接口规范,你不想去依赖对方的接口, //这时候用适配器模式比较合适,用自己接口的一个实现去依赖对方的接口并做兼 ...

  6. 《设计模式详解》结构型模式 - 适配器模式

    适配器模式 5.2 适配器模式 5.2.1 概述 5.2.2 结构 5.2.3 类适配器模式 5.2.4 对象适配器模式 5.2.5 接口适配器模式 5.2.6 应用场景 5.2.7 JDK 源码 - ...

  7. 《设计模式详解》结构型模式 - 代理模式

    代理模式 5.1 代理模式 5.1.1 概述 5.1.2 结构 5.1.3 静态代理 5.1.4 动态代理 JDK 动态代理 JDK 动态代理分析 CGLIB 动态代理 5.1.5 三种代理的对比 5 ...

  8. JAVA设计模式第三讲:结构型设计模式

    设计模式(design pattern)是对软件设计中普遍存在的各种问题,所提出的解决方案.本文以面试题作为切入点,介绍了设计模式的常见问题.我们需要掌握各种设计模式的原理.实现.设计意图和应用场景, ...

  9. 设计模式(2)结构型模式

    结构型模式 结构型模式介绍如何将对象和类组装成较大的结构, 并同时保持结构的灵活和高效. 结构型模式: 适配器模式:用来把一个接口转化成另一个接口.使得原本由于接口不兼容而不能一起工作的那些类可以在一 ...

  10. 设计模式(四)结构型模式

    前言 结构型设计模式,主要研究: 主要有哪些场景使用结构型设计模式: 每种场景应该使用何种设计模式: 以程序中的功能为核心,研究程序功能的组织结构.所以这一章,我们要把"功能结构" ...

最新文章

  1. springboot 线程池_Spring boot 2 线程池怎么配置
  2. PyCharm安装mysqlclient一直提示MS Visual C++ 14 required
  3. ORCLE 表中列的修改(非常全面哦)
  4. MATLAB 图像处理函数(第六章)(获取图像矩形像素的运用)
  5. Python正则表达式-常用函数的基本使用
  6. Codeforces 1480B. The Great Hero(阅读模拟题,注意数据范围和攻击顺序)
  7. gps天线拆解图片_华为 畅享 Z 拆解:揭秘千元5G手机物料成本是多少
  8. 洛谷P5055 【模板】可持久化文艺平衡树(FHQ Treap)
  9. ZOJ2930 The Worst Schedule(最小割)
  10. TCPDUMP/LIBPCAP 3-PCAP 中文手册(1)
  11. 看完少年的你,想到少年的我
  12. 【数学建模】基于matlab GUI停车场仿真系统【含Matlab源码 1046期】
  13. redhat5.4上安装oracle9i
  14. MSChart控件在对话框程序(vc2010 MFC)中的错误怎么解决?
  15. S3C2440 蜂鸣器 汇编语言,S3C2440的基础功能模块实现过程
  16. Delphi10.3.3 部署android 开发环境
  17. 在android tegra2中添加一个camera
  18. IPAD DHCP
  19. 【再也不怕pdf转换了】使用Python实现PDF扫描件生成DOCX或EXCEL
  20. 对计算的理解计算机科学导论论文,计算机科学导论论文

热门文章

  1. mysql单表、多表查询
  2. Lora无线终端工作原理及优缺点
  3. mysql脚本自动拉起_shell脚本自动拉起启动程序
  4. 判了!40岁程序员被判7年,曾提出系统安全问题被无视,怒删9TB财务数据及系统数据!...
  5. SVN 小乌龟 提交项目时过滤target文件或者文件下的代码
  6. IDEA使用svn进行代码分支合并
  7. 史上最萌挑战现身海天蚝油《挑战不可能之加油中国》
  8. 百度由来之众里寻他千百度
  9. 【译文】KKR与CDR53亿美元收购Cloudera影响
  10. “我学习win32com的秘诀”,本周六(7月1日)上午腾讯会议室见