这些设计模式关注类和对象的组合。继承概念被用来组合接口和定义组合对象获得新功能的方式。
一、适配器模式(Adapter Pattern)
适配器模式作为两个不兼容接口之间的桥梁,结合了两个独立接口的功能。设计单一的类加载不同或不兼容的接口
1.媒体播放器接口和更高级播放器创建接口。
public interface MediaPlayer{
public void play(String audioType,String fileName);
}
public interface AdvanceMediaPlayer{
public void playVlc(String fileName);
public void playMp4(String fileName);
}
2.创建实现AdvanceMediaPlayer接口类的实体类
public class VlcPlayer implements AdvancedMediaPlayer{
@override
public void playVlc(String fileName){
System.out.println("Play Vlc:"+fileName);
}
@override
public void playMp4(String fileName){
//do nothing
}
}
public class Mp4Player implements AdvancedMediaPlayer{
@override
public void playVlc(String fileName){
//do nothing
}
@override
public void playMp4(String fileName){
System.out.println("MP4:"+fileName);
}
}
3.创建MediaPlayer接口适配器类
public class MediaAdapter implements MediaPlayer{
AdvanceMediaPlayer advanceMusicPlayer;
public MediaAdapter(String audioType){
if(audioType.equalsIgnoreCase("vlc")){
advancedMusicPlayer=new VlcPlayer();
}else if(audioType.equalsIgnoreCase("mp4")){
advanceMusicPlayer=new Mp4Player();
}
}
@override
public void play(String audioType,String fileName){
if(audioType.equalsIgnoreCase("vlc")){
advancMusicPlayer.playVlc(fileName);
}else if(audioType.equalsIgnoreCase("Mp4")){
advanceMusicePlayer.playMp4(fileName);
}
}
}
4.创建实现MediaPlayer接口的实体类
public AudioPlayer implements MediaPlayer{
MediaAdapter mediaAdapter;
@override
public void play(String audioType,String fileName){
if(audioType.equalsIgnoreCase("mp3")){
System.out.println("mp3");
}else if(audioType.equalsIgnoreCase("vlc")
||audioType.equalsIgnoreCase("mp4")){
mediaAdapter=new MediaAdapter(audioType);
mediaAdapter.play(audioType,fileName);
}else{
System.out.println("Invalid media."+audioType+"format not supported");
}
}
}
5.使用AudioPlay来播放不同类型的音频格式
public class AdapterPatterDemo{
AudioPlayer audioPlayer=new AudioPlayer();
audioType.play("mp3","be.mp3");
audioType.play("mp4","be.mp4");
audioType.play("vlc","be.vlc");
audioType.play("avi","be.avi");
}
二、桥接模式(Bridge Pattern)
三、过滤器模式(Filter,Criteria Pattern)
四、组合模式(Composite Pattern)
五、装饰器模式(Decorator Pattern)
六、外观模式(Facade Pattern)
七、享元模式(Flyweight Pattern)
八、代理模式(Proxy Pattern)
代理设计模式,一个类代表另一个类的功能。创建现有对象的对象,以便向外界提供功能接口。代理模式不改变代理类的接口。
1.创建一个接口Image.java
public interface Image{
public void display();
}
2.创建实现接口的实体类
public class RealImage implements Image{
private String fileName;
public RealImage(String fileName){
this.fileName=fileName;
loadFromDisk(fileName);
}
@override
public void display(){
System.out.println("Display:"+fileName);
}
private void loadFromDisk(String fileName){
System.out.println("Loading:"+fileName);
}
}
//ProxyImage.java
public class ProxyImage implements Image{
private RealImage realImage;
private String fileName;
public ProxyImage(String fileName){
this.fileName=fileName;
}
@override
public void display(){
if(realImage==null){
realImage=new RealImage(fileName);
}
realImage.diaplay();
}
}
3.当被请求时,使用ProxyImage来获取RealImage类对象
public class ProxyPatternDemo{
public static void main(String[] args){
Image image=new ProxyImage("test_10.img");
image.display();
}
}