一、外观模式

定义:为子系统中一组接口提供一致的界面,此模式定义了一个高层接口,该接口使得子系统更加容易使用。

使用场景:一、在软件设计初级阶段,应该有意识的将软件两个层分开,比如经典的三层架构,降低了耦合。二、开发阶段,层与层之间的耦合愈来愈复杂,增加外观(facade)可以提供一个简单的接口,降低依赖。三、在维护大型系统时,系统难以扩展和维护,为新系统开发一个外观类,设计比较粗超或者高度复杂的遗留代码的比较清晰的简单接口,让新系统与facade交互,facade与遗留代码交互所有复杂的工作。

   实例

二、组合模式

定义:将对象组合成树形结构以表示‘部分-整体’的层次结构组合模式使得用户对单个对象和组合对象的使用具有一致性。

示意图:

使用场景:当发现需求体现的是部分和整体层次结构时,希望用户忽略组合对象和单个对象的不同,统一的使用组合结构中所有对象时,就应该考虑使用组合模式。

            实例:

                 接口

package com.softline.composite;public interface IAntivirus {public void killVirus();
}

                 实现

package com.softline.composite;public class AntivirusImage implements IAntivirus{private String name;public AntivirusImage(String name){this.name = name;}@Overridepublic void killVirus() {// TODO Auto-generated method stubSystem.out.println("对图片"+name+"进行扫描杀毒!");}}package com.softline.composite;public class AntivirusText implements IAntivirus {private String name;public AntivirusText(String name){this.name = name;}@Overridepublic void killVirus() {// TODO Auto-generated method stubSystem.out.println("对文本"+name+"进行扫描杀毒!");}}package com.softline.composite;import java.util.ArrayList;
import java.util.List;public class AntivirusFile implements IAntivirus {private String name;public AntivirusFile(String name){this.name = name;}public List<IAntivirus> list = new ArrayList<IAntivirus>();public void add(IAntivirus antivirus){list.add(antivirus);}public void remove(IAntivirus antivirus){list.remove(antivirus);}@Overridepublic void killVirus() {// TODO Auto-generated method stubSystem.out.println("对文件"+name+"进行扫描杀毒!");for(IAntivirus antivirus:list){antivirus.killVirus();}}}

                 客户端

package com.softline.composite;public class Client {public static void main(String[] args) {IAntivirus file1,file2;file1 = new AntivirusImage("image.jpg");file2 = new AntivirusText("text.txt");AntivirusFile file3 = new AntivirusFile("file");file3.add(file1);file3.add(file2);file3.killVirus();}}window:
对文件file进行扫描杀毒!
对图片image.jpg进行扫描杀毒!
对文本text.txt进行扫描杀毒!

二、装饰模式

定义:动态的给一个对象添加一些额外的职责,就增加功能来说装饰模式比生成子类更加灵活。

             使用场景:装饰者模式是为已有的功能添加更多功能的一种方式,当系统需要新的功能的时候是想就得类中添加新的代码。这些新加的代码通常装饰了原有类的核心职责或主要行为。这些新加的东西仅仅是为了满足一些只在特定情况下才会执行的类,并让这个类包装他所需要的对象。因此,当需要执行特殊行为时,客户代码就可以在运行时更具需要有选择的、按顺序的使用装饰功能包装对象了。

示意图:

实例:

食物,接口、实现类

package com.softline.decorator;public interface IFood {public void getFood();}package com.softline.decorator;public class Chicken implements IFood {private String dec = "鸡肉";@Overridepublic void getFood() {// TODO Auto-generated method stubSystem.out.println(dec);}}

装饰抽象类、实现类

package com.softline.decorator;public abstract class Decorator implements IFood {@Overridepublic abstract void getFood();public abstract void cookFood();}package com.softline.decorator;public class Roast extends Decorator {private IFood food;public Roast(IFood food){this.food=food;}@Overridepublic void getFood() {// TODO Auto-generated method stubcookFood();food.getFood();}@Overridepublic void cookFood() {// TODO Auto-generated method stubSystem.out.print("烤");}}package com.softline.decorator;public class Braise extends Decorator {private IFood food;public Braise(IFood food){this.food = food;}@Overridepublic void getFood() {// TODO Auto-generated method stubcookFood();food.getFood();}@Overridepublic void cookFood() {// TODO Auto-generated method stubSystem.out.print("蒸");}}

客户端

package com.softline.decorator;public class Client {public static void main(String[] args) {IFood chicken = new Chicken();chicken.getFood();IFood roast = new Roast(chicken);IFood braise = new Braise(chicken);roast.getFood();braise.getFood();}
}window:
鸡肉
烤鸡肉
蒸鸡肉

三、享元模式

定义:运用共享技术有效的支持大量细粒度的对象。

             使用场景:享元模式可以避免大量非常相似类的开销。在程序设计中,有时需要生成大量细粒度的类和实例来生成数据。如果发现这些实例除了几个参数外基本都是相同的,有时就能减少需要实例化类的数量。如果能够把这些参数移动到类实例的外面,在方法调用时传递进来,就可以通过共享大幅度的减少实例的数目。

示意图:

实例:

围棋接口、坐标、实现类

package com.softline.flyweight;public interface IStone {public void getColor();public Location getLocation();public void setLocation(Location location);
}package com.softline.flyweight;public class Location {private String x = "x";private String y = "y";@Overridepublic String toString() {return "Location [x=" + x + ", y=" + y + "]";}
}package com.softline.flyweight;public class StoneImpl implements IStone {private String color;private Location location;public StoneImpl(String color){this.color=color;}@Overridepublic void getColor() {// TODO Auto-generated method stubSystem.out.println("棋子的颜色是:"+color);}public Location getLocation() {return location;}public void setLocation(Location location) {this.location = location;}}

围棋静态工厂类:

package com.softline.flyweight;import java.util.HashMap;
import java.util.Map;public class StoneFactory {private static Map<String,IStone> map = new HashMap<String,IStone>();public static IStone getStone(String color){if(map.containsKey(color)){return map.get(color);}else{IStone stone = new StoneImpl(color);map.put(color, stone);return stone;}}}

客户端:

package com.softline.flyweight;public class Client {public static void main(String[] args) {IStone stone1 = StoneFactory.getStone("黑色");IStone stone2 = StoneFactory.getStone("黑色");System.out.println(stone1);System.out.println(stone2);stone1.setLocation(new Location());System.out.println(stone2.getLocation().toString());}}windows:
com.softline.flyweight.StoneImpl@15db9742
com.softline.flyweight.StoneImpl@15db9742
Location [x=x, y=y]

java设计模式之——外观模式、组合模式、装饰模式、享元模式(结构型)相关推荐

  1. 设计模式学习笔记(十二)享元模式及其应用

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  2. 23种设计模式C++源码与UML实现--享元模式

    享元模式 Flyweight模式也叫做享元模式,是构造型模式之一,他通过与其他类似对象共享数据来减少内存占用. 抽象享元模式: 所有具有享元类的父亲,规定一些需要实现的公共接口. 具体享元角色: 抽象 ...

  3. 图解Java设计模式学习笔记——结构型模式(适配器模式、桥接模式、装饰者模式、组合模式、外观模式、享元模式、代理模式)

    一.适配器模式(类适配器.对象适配器.接口适配器) 1.现实生活中的例子 泰国插座用的是两孔的(欧标),可以买个多功能转换插头(适配器),这样就可以使用了国内的电器了. 2.基本介绍 适配器模式(Ad ...

  4. Java设计模式(装饰者模式-组合模式-外观模式-享元模式)

    Java设计模式Ⅳ 1.装饰者模式 1.1 装饰者模式概述 1.2 代码理解 2.组合模式 2.1 组合模式概述 2.2 代码理解 3.外观模式 3.1 外观模式概述 3.2 代码理解 4.享元模式 ...

  5. Day314.外观模式享元模式 -Java设计模式

    外观模式 外观类就是总控开关,去管理聚合的所有类 一.影院管理项目 组建一个家庭影院: DVD 播放器.投影仪.自动屏幕.环绕立体声.爆米花机,要求完成使用家庭影院的功能,其过程为: 直接用遥控器:统 ...

  6. 设计模式-04.02-结构型设计模式-门面模式组合模式享元模式

    文章目录 门面模式(外观模式)[不常用] 门面模式的原理与实现 Demo案例-影院管理 传统方案 门面模式代码 TheaterLight Stereo Screen Projector Popcorn ...

  7. JAVA设计模式--享元模式

    目录 一.什么是享元模式 二.享元模式在Java中的典型应用 三.享元模式的结构 单纯享元模式 复合享元模式 四.享元模式应用举例 五.享元模式的适用性 六.享元模式的特点 七.总结 一.什么是享元模 ...

  8. JAVA 设计模式 享元模式

    用途 享元模式 (Flyweight) 运用共享技术有效地支持大量细粒度的对象. 享元模式是一种结构型模式. 结构 图-享元模式结构图 Flyweight : 它是所有具体享元类的超类或接口,通过这个 ...

  9. Java设计模式之享元模式(UML类图分析+代码详解)

    大家好,我是一名在算法之路上不断前进的小小程序猿!体会算法之美,领悟算法的智慧~ 希望各位博友走过路过可以给我点个免费的赞,你们的支持是我不断前进的动力!! 加油吧!未来可期!! 本文将介绍java设 ...

  10. Java设计模式之享元模式

    Java设计模式之享元模式 1. 享元模式概述 1.1 享元定义 1.2 享元模式注意事项 2. 享元模式实现 1. 享元模式概述 1.1 享元定义 1)享元模式(享元模式)也叫蝇量模式:利用共享技术 ...

最新文章

  1. 终于!这个强大的「开源图像识别系统」上线了!
  2. springboot+vue前后端分离实现宿舍管理系统
  3. 作业三——原型化系统——外卖app
  4. scrapy爬取百万小说
  5. 任务型对话系统预训练最新研究进展
  6. Pytorch 为什么每一轮batch需要设置optimizer.zero_grad
  7. Spring Boot基础学习笔记23:用户自定义授权管理
  8. linux read函数_浅谈Linux内核IO体系之磁盘IO
  9. 配置eclipse,创建类/方法时自动生成作者、创建日期、方法功能等注释
  10. 【渝粤教育】国家开放大学2018年春季 3922T汽车运用基础 参考试题
  11. sqlplus格式调整
  12. 【镜像取证篇】VMware虚拟机配置文件取证
  13. 2021多校补题(8)
  14. c4d如何把文字贴在物体表面_C4D立体贴地面字基础知识点
  15. 网页中打开某个网页自动弹出扣扣群实现方法
  16. VB 提示框MsgBox用法
  17. 只要60页!金融量化博士总结的Python数据分析入门知识手册
  18. Unity引擎制作仿《文明》游戏
  19. 让自己更优秀的 16 条法则(建议收藏)
  20. 数据库系统概论 第七章设计数据库

热门文章

  1. COCI 2013/2014 1st round, September 28th, 2013 解题报告
  2. 038Node.js后端服务处理端口号被占用的解决方案portfinder
  3. 工业计算机控制数据采集板卡,PCI-6289数据采集板卡
  4. 2022-04-03 关于C++中标准输入cin失效的问题
  5. 时间不一定能证明许多东西,但一定会让你看透许多东西。
  6. 事务Transaction的简写成tx的原因
  7. html判断 token,(html)前端如何验证token的合法性来判断用户是否登录?
  8. 释迦牟尼:最经典和灵性的4句话
  9. 关于最近面试的通过2个offer然后被刷
  10. 图像处理(4)--基于内容的图像检索