在学习java设计模式的时候发现装饰器模式和委托模式存在一些相似之处,在这里总结这两种设计模式顺便巩固所学加深理解。
对了,本人学习的是B站up主 子烁爱学习 的视频,本文部分代码也来源于此。并对其进行了扩展。
装饰器模式
装饰器模式就是在原有类的基础上动态添加新的功能,这种添加功能的方式不同于继承,它是在对象层面实现功能扩展,而不是继承的类层面,因此说装饰器模式比继承更加灵活。
此外,装饰器模式属于结构型设计模式。创建型可以理解为生成新的对象,而结构型可以理解为构建更大的类或类对象。这里我们举一个机器人的例子,假如第一代机器人可以实现唱歌、对话的功能,代码如下:
/*
定义一个机器人接口
*/
interface Robot{
void dosomething();
}
/*
实现第一代机器人
*/
class FirstRobot implements Robot{
@Override
public void dosomething() {
System.out.println("对话");
System.out.println("唱歌");
}
}
接下来加入我们想让机器人实现另外的功能比如扫地,跳舞,我们通过动态的加装饰器的方式对其进行扩展,首先我们定义一个装饰器基类,代码如下:
abstract class RobotDecorator implements Robot{
protected final Robot robot;
public RobotDecorator(Robot robot) {
this.robot = robot;
}
public abstract void dosomething();
}
然后我们将扩展的两种功能分别实现为装饰器类:
class saodiRobot extends RobotDecorator{
public saodiRobot(Robot robot) {
super(robot);
}
public void dosomething() {
robot.dosomething();
System.out.println("扫地");
}
}
class tiaowuRobot extends RobotDecorator{
public tiaowuRobot(Robot robot) {
super(robot);
}
public void dosomething() {
robot.dosomething();
System.out.println("跳舞");
}
}
然后在调用的时候我们需要哪个装饰就套入哪个装饰即可:
public class demo {
public static void main(String[] args) {
Robot aRobot = new FirstRobot();
Robot bRobot = new saodiRobot(aRobot);
Robot cRobot = new tiaowuRobot(bRobot);
cRobot.dosomething();
}
}
结果如下:
委托模式
委托模式如何理解呢,假如想买上面的机器人产品,但是呢我又不能去实体店只能在网上买(比如某宝),也就是我得委托某宝帮我买然后邮给我。来看看这个是怎么实现的
首先定义一个买家接口,实现具体的买家类
/*
* 买主接口
*/
interface buyer{
public void dosomething();
}
class me implements buyer{
private moubao taobao;
public me(int flag) {
taobao = new moubao(flag);
}
@Override
public void dosomething() {
taobao.dosomething();
}
}
可以看到买家里面呢例化了一个委托平台,并且在买家类里面调用了委托类的方法,那么委托平台怎么实现呢
class moubao implements Robot{
Robot robot;
public moubao(int flag) {
if(flag == 1) {
robot = new FirstRobot();
}
if(flag == 2) {
Robot aRobot = new FirstRobot();
robot = new saodiRobot(aRobot);
}
}
@Override
public void dosomething() {
robot.dosomething();
}
}
可以看到委托平台是我们要买的机器人的接口的类,在委托平台类里面我们根据买主的选择定义了不同层次的机器人,定义方法呢是通过加装饰器的方法实现的,然后重写了机器人的方法。
因此我们就可以定义一个买主,然后买主想要什么样的功能直接通过构造方法的方式传给委托平台帮买主实现,买主可以直接调用即可。
public class demo2 {
public static void main(String[] args) {
me hufei = new me(2);
hufei.dosomething();
}
}
结果如下
以上就是装饰器模式和委托模式的介绍。