Java设计模式(一)

Wesley13
• 阅读 701

Structural patterns 结构型模式

1.适配器模式(Adaptor)

目的:将某个类/接口转换为client期望的其他形式。适配器让类可以协同工作,否则就会因为不兼容的接口而无法工作。通过增加 一个接口,将已存在的子类封装起来,client 面向接口编程,从而隐藏了具体子类。

假设我们有一个MediaPlayer接口和一个实现了 MediaPlayer 接口的实体类 AudioPlayer_。默认情况下,_AudioPlayer 可以播放 mp3 格式的音频文件。

我们还有另一个接口 AdvancedMediaPlayer 和实现了 AdvancedMediaPlayer 接口的实体类。该类可以播放 vlc 和 mp4 格式的文件。

要想让AudioPlayer 播放其他格式的音频文件。需要一个适配器,这个适配器实现了MediaPayer接口,在这个适配器类里,用_AdvancedMediaPlayer接口,实例化实现它的两个类,_

public class MediaAdapter implements MediaPlayer {

   AdvancedMediaPlayer advancedMusicPlayer;

   public MediaAdapter(String audioType){ if(audioType.equalsIgnoreCase("vlc") ){ advancedMusicPlayer = new VlcPlayer(); } else if (audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer = new Mp4Player(); } } @Override public void play(String audioType, String fileName) { if(audioType.equalsIgnoreCase("vlc")){ advancedMusicPlayer.playVlc(fileName); }else if(audioType.equalsIgnoreCase("mp4")){ advancedMusicPlayer.playMp4(fileName); } } }

然后在正常实现MediaPlayer接口的实体类里,提供播放其他文件格式的支持,

 1 public class AudioPlayer implements MediaPlayer {  2  MediaAdapter mediaAdapter;  3  4  @Override  5 public void play(String audioType, String fileName) {  6  7 //播放 mp3 音乐文件的内置支持  8 if(audioType.equalsIgnoreCase("mp3")){  9 System.out.println("Playing mp3 file. Name: "+ fileName); 10  } 11 //mediaAdapter 提供了播放其他文件格式的支持 12 else if(audioType.equalsIgnoreCase("vlc") 13 || audioType.equalsIgnoreCase("mp4")){ 14 mediaAdapter = new MediaAdapter(audioType); 15  mediaAdapter.play(audioType, fileName); 16  } 17 else{ 18 System.out.println("Invalid media. "+ 19 audioType + " format not supported"); 20  } 21  } 22 }

 装饰器模式(Decorator)

装饰器模式是为了解决以下问题出现的一个设计模式:为对象增加不同侧面的 特性。  在这种设计模式下,我们对每一个特性构造子类,通过委派机制增加到对象 上。

Java设计模式(一)

装饰器 vs. 继承
• 装饰器在运行时组成特征;继承在编译时组成特征。

• 装饰器由多个协作对象组成;继承产生一个明确类型的对象。

• 可以混合和匹配多个装饰;多重继承在概念上是困难的。

外观模式(Facade Pattern)

隐藏系统的复杂性,并向客户端提供了一个客户端可以访问系统的接口。这种类型的设计模式属于结构型模式,它向现有的系统添加一个接口,来隐藏系统的复杂性。

创建一个接口。

Shape.java

public interface Shape { void draw(); }

创建实现接口的实体类。

Rectangle.java

public class Rectangle implements Shape { @Override public void draw() { System.out.println("Rectangle::draw()"); } }

Square.java

public class Square implements Shape { @Override public void draw() { System.out.println("Square::draw()"); } }

Circle.java

public class Circle implements Shape { @Override public void draw() { System.out.println("Circle::draw()"); } }

创建一个外观类。

ShapeMaker.java

public class ShapeMaker { private Shape circle; private Shape rectangle; private Shape square; public ShapeMaker() { circle = new Circle(); rectangle = new Rectangle(); square = new Square(); } public void drawCircle(){ circle.draw(); } public void drawRectangle(){ rectangle.draw(); } public void drawSquare(){ square.draw(); } }

使用该外观类画出各种类型的形状。

FacadePatternDemo.java

public class FacadePatternDemo { public static void main(String[] args) { ShapeMaker shapeMaker = new ShapeMaker(); shapeMaker.drawCircle(); shapeMaker.drawRectangle(); shapeMaker.drawSquare();         } }
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
5个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Easter79 Easter79
3年前
Spring的两种代理JDK和CGLIB的区别浅谈
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
7、【C++ STL】适配器
1、基本概念适配器,在STL中扮演着转换器的角色,本质上是一种设计模式,用于将一种接口转换成另一种接口,从而是原本不兼容的接口能够很好地一起运作。适配器不提供迭代器。2、基本类型根据目标接口的类型,适配器可分为以下几类:(1)改变容器的接口,称为容器适配器;(2)改变迭代器的接口,称为迭代器适配器;
Easter79 Easter79
3年前
Spring的两种动态代理:Jdk和Cglib 的区别和实现
一、原理区别:java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理。而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理。1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2、如果目标对象实现了接口,可以
Wesley13 Wesley13
3年前
Java 设计模式系列(十二)策略模式(Strategy)
Java设计模式系列(十二)策略模式(Strategy)策略模式属于对象的行为模式。其用意是针对一组算法,将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换。策略模式使得算法可以在不影响到客户端的情况下发生变化。一、策略模式的结构策略模式是对算
Wesley13 Wesley13
3年前
Java适配器设计模式 的优缺点
1\.定义:将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。2\.适配器模式的本质转换匹配,复用功能。3\.优点:更好的复用如果功能是已经有了的,只是接口不兼容,那么通过适配器模式就可以让这些功能得到更好的复用。更好的可扩展在实现适配器功能的时候,可以调用自己
Wesley13 Wesley13
3年前
Java中的设计模式
注:基于《Java高并发编程详解汪文君》、《深入理解JVM高级特性与最佳实践周志明》,以学习为目的,加上自身理解、验证。作为笔记,为加深印象,做到不复制,不粘贴。欢迎,大家一起交流学习。适配器模式如果当前类的接口不适用与客户端,那么把它转换为客户端所能接受的另一种接口就是适配器模式。从而使得两个接口不匹配而无法在一起工作的两个类能够在一起
Wesley13 Wesley13
3年前
Java 设计模式系列(十三)模板方法
Java设计模式系列(十三)模板方法模板方法模式是类的行为模式。准备一个抽象类,将部分逻辑以具体方法以及具体构造函数的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑。不同的子类可以以不同的方式实现这些抽象方法,从而对剩余的逻辑有不同的实现。这就是模板方法模式的用意。一、模板方法的结构