设计模式简介
什么是设计模式?
设计模式是可以重复利用的解决方案。软件开发的先驱或者前辈们将之前在开发中遇到的问题进行总结并给出了解决方案,后辈在遇到这些问题之后直接使用这些方案即可解决问题。比如盖高楼,都是先挖地基,然后再盖,如果先盖楼后挖地基,可能盖不了几层,楼就倒了。
装饰者设计模式
使用场景:
给某个对象的功能进行扩展时,可以考虑使用装饰者设计模式。
在IO流这部分内容中,JDK的源码使用了大量的装饰者设计模式。比如BufferedReader可以对FileReader进行装饰。
以去拉面馆吃拉面为例,一碗面做好后都会向里面加料装饰,所以先定义一个装饰拉面的接口,提供一个加料的方法:
/** * 定义一个给面加料的接口 */ public interface NoodleDecorate { void addThings(); }
创建一个拉面(Noodle)类实现NoodleDecorate接口
public class Noodle implements NoodleDecorate { /** * 向面里加东西 */ @Override public void addThings() { System.out.println("加两片肉末"); System.out.println("加一片萝卜"); System.out.println("加三根香菜"); } }
普通的拉面做好之后,有人爱吃辣椒,想在拉面中添加辣椒,创建一个辣椒拉面(ChiliNoodle)类
/** * 就是在不改变原有拉面的情况下,添加自己想要的调料 */ public class ChiliNoodle implements NoodleDecorate { private Noodle noodle; public ChiliNoodle(Noodle noodle) { this.noodle = noodle; } @Override public void addThings() { noodle.addThings(); System.out.println("加三勺辣椒"); } }
写一个测试类
public class NoodleTest { public static void main(String[] args) { /** * 获取加过辣椒的面 */ new ChiliNoodle(new Noodle()).addThings(); } }
这样就获得了加过料的拉面了,或者你不想要辣椒,想加鸡蛋的话,也可以自己加,而不用重新做一碗面
(总结)装饰者设计模式的优点:
不用修改被装饰对象的源码,装饰者与被装饰者耦合度不高。