设计模式之结构型模式
1、适配器模式
/** * 目标抽象类:定义客户所需接口 */ public interface Target { void m1(); void m2(); } /**适配器模式: * 适用场景:(1)系统需要使用一些现有的类,而这些类的接口不符合系统的需要,甚至没有这些类的源代码 * (2)想创建一个可以重复使用的类,用于一些彼此之间没有太大关联的一些类 * 优点:适配器模式将目标类和适配者类解耦,通过引入适配器类来重用现有的适配者类,无需修改原有结构 * 适配器类:适配者类和适配器类是关联关系,并且适配者作为对象被适配器引入,所以此种适配器也叫对象适配器 */ public class Adapter implements Target { private ClassA classA; private ClassB classB; public Adapter(){ classA=new ClassA(); classB=new ClassB(); } @Override public void m1(){ classA.m1(); } @Override public void m2(){ classB.m2(); } } /** * 适配者类 */ public class ClassA { public void m1(){ System.out.println("ClassA--m1"); } public void m2(){ System.out.println("ClassA--m2"); } } /** * 适配者类 */ public class ClassB { public void m1(){ System.out.println("ClassB--m1"); } public void m2(){ System.out.println("ClassB--m2"); } }
/** * 缺省适配器类:定义成抽象类,使用空方法实现Target接口的所有接口。 */ public abstract class AbstractAdapter implements Target { public void m1() { } public void m2() { } }
2、代理模式
/** * 抽象主题类 */ public interface Subject { void request(); } /** * 代理模式 * 代理类 */ public class Proxy implements Subject { private RealSubject realSubject; public Proxy() { realSubject = new RealSubject(); } public void proRequest() { System.out.println("proRequest"); } @Override public void request() { proRequest(); realSubject.request(); afterRequest(); } public void afterRequest() { System.out.println("afterRequest"); } } /** * 真实主题类 */ public class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject"); } }
3 桥接模式
有pen和pencil两种笔(第一维度),如果让两种笔都实现蓝色和红色功能(第二维度),则使用桥接模式
/** * 抽象类 */ public abstract class Abstraction { protected Implementor implementor;//与Implementor接口建立关联关系 public void setImplementor(Implementor implementor){ this.implementor=implementor; } public abstract void operate(); } public class Pen extends Abstraction { @Override public void operate() { System.out.println("paint by pen"); implementor.paint(); } } public class PenCil extends Abstraction { @Override public void operate() { System.out.println("paint by pencil"); implementor.paint(); } } public interface Implementor { void paint(); } public class BlueImplementor implements Implementor { @Override public void paint() { System.out.println("color is blue"); } } public class RedImplementor implements Implementor { @Override public void paint() { System.out.println("color is red"); } }
4、组合模式
public interface File { void operate(); } public class Folder implements File { private List<File> files=new ArrayList<>(); @Override public void operate() { for (File file : files){ file.operate();// 此处递归调用了子节点的operate } } public List<File> getFiles() { return files; } public void addFiles(File file) { this.files.add(file); } } public class ImageFile implements File { @Override public void operate() { System.out.println("kill imageFile"); } } public class TextFile implements File { @Override public void operate() { System.out.println("kill TextFile"); } } public class Test { /** * 需求:有folder1{imageFile1,folder{imageFile,textFile}}的文件夹结构,现需要遍历folder1中的所有文件并进行杀毒操作 * 组合模式是用来处理树形结构的模型 * 容器类(Folder)和叶子类(ImageFile和TextFile)都实现了接口File,进而可以对容器类和叶子类进行统一处理 * @param args */ public static void main(String[] args){ Folder folder=new Folder(); ImageFile imageFile=new ImageFile(); TextFile textFile=new TextFile(); folder.addFiles(imageFile); folder.addFiles(textFile); Folder folder1=new Folder(); ImageFile imageFile1=new ImageFile(); folder1.addFiles(imageFile1); folder1.addFiles(folder); folder1.operate(); } }
输出:
kill imageFile
kill imageFile
kill TextFile