设计模式之装饰者模式-java实例

时间:2023-03-09 13:33:17
设计模式之装饰者模式-java实例

设计模式之装饰者模式

需求场景

  • 我们有了别人提供的产品,但是别人提供的产品对我们来说还不够完善,我们需要对这个产品的功能进行补强,此时可以考虑使用装饰者模式。
  • 我们已经有了产品,而且这个产品的功能非常复杂,我们想要给这个产品加上新的功能,但是我们不愿意去修改其他功能的源代码,此时也可以使用装饰者模式对产品的功能进行扩展。
  • 上面的场景是基于生产环境的场景,在我们普通的编码过程中,遇到类似的问题,也可以考虑使用装饰者模式对方法进行增强。

前提条件

想要使用装饰者模式,我们需要获取到被装饰的类所实现的接口,这样才能对这个类进行修饰或补强。

案例

首先是我们的产品接口,比如现在我们的产品是一部手机,我们的接口标准是IMobile,它有一个通话的功能call。

public interface IMobile {
public void call();
}

现在我们的产品为了适应市场通用标准,我们也实现了这个标准接口,开发出了我们的手机产品的操作软件。

public class MobileImpl implements IMobile {
@Override
public void call(){
System.out.println("双方通话中");
}
}

我们的软件卖给了客户,而客户是不知道我们的源代码的,只得到了我们提供的jar包。但是现在用户那边由于业务需求,在通话之前需要获取到当前通话双方的位置信息,这个功能是我们没有提供的。现在客户打算自己来增强这款软件的功能,就需要用到装饰者模式。客户自己也实现当前的市场标准接口,将我们产品的实现类传递进去进行装饰。

public class CustomMobileImpl implements IMobile {
//被装饰的产品
private IMobile mobile;
//构造方法传入被装饰产品
public CustomMobileImpl(IMobile mobile){
this.mobile = mobile;
}
//产品功能补强
@Override
public void call(){
//补强的功能
System.out.println("获取通话双方位置信息")
//原来的功能
mobile.call();
}
}

现在,我们在没有修改源代码,也不知道源代码的情况下,得到了一款功能增强的产品,让我们来试一试吧。

public class Test{
public static void main(String[] args){
IMobile mobile = new CustomMobileImpl(new MobileImpl());
mobile.call();
}
}

结果如下:

获取通话双方位置信息

双方通话中

总结

装饰者模式是一种常用的开发模式,可以帮助开发者在不修改原来的功能代码的情况下,对原来的方法进行增强,前提是装饰类要和被装饰类实现同样的接口。

开发模式是前人对某一类相似问题的解决方案进行的总结,我们可以从中吸取经验,但也不能盲目使用,也不能为了使用设计模式而使用设计模式。作为一个coder,要始终保持自己活跃的思维,不能将思维局限在一个设计模式上。开发熟练度在一定程度上决定了你的工作效率,但是思维的活跃度和发散性决定了你的天花板,也在很大程度上决定了你的工作效率。

你虽然在为别人工作,但是,你也在创造自己的世界!