前言
今年大年初四,在家窝着第五天了,无聊至极,今天就来写一下设计模式吧。设计模式是大师们编码经验的总结,没有什么神的,今天来写一下装饰者模式和代理模式吧。代理模式和装饰者模式本质上是很像的,都是对一个类的扩展。
第一个类扩展的有以下三种途径:
- 继承有子类重写方法进行扩展
- 装饰者模式
- 代理模式
装饰者模式
装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其结构。这种类型的设计模式属于结构型模式,它是作为现有的类的一个包装。
装饰者模式对原有类的增强是通过一个装饰类实现的,既可以保证原有类的不变,又可以达到对类的增强。
代码实现
原有接口:
/**
*
* @author wangyz
* @version Shape.java, v 0.1 2019-10-24 16:08
*/
public interface Shape {
/**
* 画方法
*/
public void draw();
}
原有实现类:
/**
*
* @author wangyz
* @version Cricle.java, v 0.1 2019-10-24 16:11
*/
public class Cricle implements Shape {
/**
* 画个圆
*/
@Override
public void draw() {
System.out.println("画一个圆");
}
}
装饰者类:
/**
*
* @author wangyz
* @version ShapeDecorator.java, v 0.1 2019-10-24 16:14
*/
public class ShapeDecorator {
private Shape shape;
public ShapeDecorator(Shape shape) {
this.shape = shape;
}
public void draw(){
shape.draw();
System.out.println("给圆上红色");
}
}
测试类:
/**
*
* @author wangyz
* @version DecoratorTest.java, v 0.1 2019-10-24 16:16
*/
public class DecoratorTest {
/**
* 装饰者模式测试类
*/
@Test
public void test1(){
ShapeDecorator shapeDecorator = new ShapeDecorator(new Cricle());
shapeDecorator.draw();
}
}
运行结果:
代理模式
在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。
代理模式的本质不是对类进行增强,而是对类进行代理,所谓代理就是借用自己的身份行使原类的功能,当然在代理类里可以对类进行加以增强,比如权限校验和日志打印,常见的Spring框架就会对我们项目中的bean进行代理。
代码实现
原有接口:
/**
*
* @author wangyz
* @version Image.java, v 0.1 2019-10-31 17:25
*/
public interface Image {
/**
* 展示图片
* @param fileName
*/
void display(String fileName);
}
原有类:
/**
*
* @author wangyz
* @version RealImage.java, v 0.1 2019-10-31 17:27
*/
public class RealImage implements Image {
/**
* 展示图片
* @param fileName
*/
@Override
public void display(String fileName) {
System.out.println("展示文件:" + fileName);
}
}
代理类:
/**
*
* @author wangyz
* @version ProxyImage.java, v 0.1 2019-10-31 17:28
*/
public class ProxyImage implements Image {
private RealImage realImage;
public ProxyImage() {
}
@Override
public void display(String fileName) {
if (realImage == null){
realImage = new RealImage();
}
realImage.display(fileName);
}
}
测试类:
/**
*
- @author wangyz
- @version ProxyTest.java, v 0.1 2019-10-31 17:31
*/
public class ProxyTest {
@Test
public void test(){
ProxyImage proxyImage = new ProxyImage();
proxyImage.display("米老鼠.jpg");
}
}
运行结果:
小结
代理模式和装饰者模式本质上没有区别,都是新开一个类里维护一个原有类的引用,在新类里写一个方法调用原有类的方法。虽然代理模式和装饰者模式本质上没有区别,但是就功能上还是有区别的,区别有以下几点:
- 装饰者模式着重于类的功能增强
- 代理模式着重于类的控制