有哪些h5做的網(wǎng)站怎么卸載windows優(yōu)化大師
Java裝飾器模式
- 摘要
- 實(shí)現(xiàn)
- 范例
-
裝飾器模式(Decorator Pattern)允許向一個(gè)現(xiàn)有的對(duì)象添加新的功能,同時(shí)又不改變其結(jié)構(gòu)
-
裝飾器模式創(chuàng)建了一個(gè)裝飾類(lèi),用來(lái)包裝原有的類(lèi),并在保持類(lèi)方法簽名完整性的前提下,提供了額外的功能
裝飾器模式屬于結(jié)構(gòu)型模式,它是作為現(xiàn)有的類(lèi)的一個(gè)包裝
摘要
1. 意圖
動(dòng)態(tài)地給一個(gè)對(duì)象添加一些額外的職責(zé)。就增加功能來(lái)說(shuō),裝飾器模式相比生成子類(lèi)更為靈活
2. 主要解決
一般的,我們?yōu)榱藬U(kuò)展一個(gè)類(lèi)經(jīng)常使用繼承方式實(shí)現(xiàn),由于繼承為類(lèi)引入靜態(tài)特征,并且隨著擴(kuò)展功能的增多,子類(lèi)會(huì)很膨脹
3. 何時(shí)使用
- 在不想增加很多子類(lèi)的情況下擴(kuò)展類(lèi)
4. 如何解決
將具體功能職責(zé)劃分,同時(shí)繼承裝飾者模式
5. 關(guān)鍵代碼
- Component類(lèi)充當(dāng)抽象角色,不應(yīng)該具體實(shí)現(xiàn);
- 修飾類(lèi)引用和繼承Component類(lèi),具體擴(kuò)展類(lèi)重寫(xiě)父類(lèi)方法;
6. 應(yīng)用實(shí)例
- 孫悟空有72變,當(dāng)他變成”廟宇”后,他的根本還是一只猴子,但是他又有了廟宇的功能;
- 不論一幅畫(huà)有沒(méi)有畫(huà)框都可以?huà)煸趬ι?#xff0c;但是通常都是有畫(huà)框的,并且實(shí)際上是畫(huà)框被掛在墻上在掛在墻上之前,畫(huà)可以被蒙上玻璃,裝到框子里;這時(shí)畫(huà)、玻璃和畫(huà)框形成了一個(gè)物體;
7. 優(yōu)點(diǎn)
- 裝飾類(lèi)和被裝飾類(lèi)可以獨(dú)立發(fā)展,不會(huì)相互耦合,裝飾模式是繼承的一個(gè)替代模式,裝飾模式可以動(dòng)態(tài)擴(kuò)展一個(gè)實(shí)現(xiàn)類(lèi)的功能
8. 缺點(diǎn)
- 多層裝飾比較復(fù)雜
9. 使用場(chǎng)景
- 擴(kuò)展一個(gè)類(lèi)的功能;
- 動(dòng)態(tài)增加功能,動(dòng)態(tài)撤銷(xiāo);
10. 注意事項(xiàng)
- 可代替繼承
實(shí)現(xiàn)
- 創(chuàng)建一個(gè)Shape接口和實(shí)現(xiàn)了Shape接口的實(shí)體類(lèi);
- 創(chuàng)建一個(gè)實(shí)現(xiàn)了Shape接口的抽象裝飾類(lèi)ShapeDecorator,并把Shape對(duì)象作為它的實(shí)例變量;
- 創(chuàng)建類(lèi)RedShapeDecorator實(shí)現(xiàn)了ShapeDecorator實(shí)體類(lèi);
- 創(chuàng)建類(lèi)DecoratorPatternDemo使用RedShapeDecorator來(lái)裝飾Shape對(duì)象;
范例
我們通過(guò)下面的范例來(lái)演示裝飾器模式的用法,其中,我們將把一個(gè)形狀裝飾上不同的顏色,同時(shí)又不改變形狀類(lèi)
1.創(chuàng)建一個(gè)接口.
Shape.java
package com.demo.gof;
public interface Shape {void draw();
}
2. 創(chuàng)建實(shí)現(xiàn)接口的實(shí)體類(lèi)
Rectangle.java
package com.demo.gof;
public class Rectangle implements Shape {@Overridepublic void draw() {System.out.println("Shape: Rectangle");}
}
Circle.java
package com.demo.gof;
public class Circle implements Shape {@Overridepublic void draw() {System.out.println("Shape: Circle");}
}
3. 創(chuàng)建實(shí)現(xiàn)了 Shape 接口的抽象裝飾類(lèi)
ShapeDecorator.java
package com.demo.gof;
public abstract class ShapeDecorator implements Shape {protected Shape decoratedShape;public ShapeDecorator(Shape decoratedShape){this.decoratedShape = decoratedShape;}public void draw(){decoratedShape.draw();}
}
4. 創(chuàng)建擴(kuò)展了 ShapeDecorator 類(lèi)的實(shí)體裝飾類(lèi)
RedShapeDecorator.java
package com.demo.gof;
public class RedShapeDecorator extends ShapeDecorator {public RedShapeDecorator(Shape decoratedShape) {super(decoratedShape); }@Overridepublic void draw() {decoratedShape.draw(); setRedBorder(decoratedShape);}private void setRedBorder(Shape decoratedShape){System.out.println("Border Color: Red");}
}
5. 使用 RedShapeDecorator 來(lái)裝飾 Shape 對(duì)象
DecoratorPatternDemo.java
package com.demo.gof;
public class DecoratorPatternDemo {public static void main(String[] args) {Shape circle = new Circle();Shape redCircle = new RedShapeDecorator(new Circle());Shape redRectangle = new RedShapeDecorator(new Rectangle());System.out.println("Circle with normal border");circle.draw();System.out.println("\nCircle of red border");redCircle.draw();System.out.println("\nRectangle of red border");redRectangle.draw();}
}
編譯運(yùn)行以上 Java 范例,輸出結(jié)果如下
$ javac -d . src/main/com.demo/gof/DecoratorPatternDemo.java
$ java com.demo.gof.DecoratorPatternDemo
Circle with normal border
Shape: CircleCircle of red border
Shape: Circle
Border Color: RedRectangle of red border
Shape: Rectangle
Border Color: Red