JAVA设计模式之装饰者模式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JAVA设计模式之装饰者模式相关的知识,希望对你有一定的参考价值。

JAVA设计模式之【装饰者模式】

装饰模式 对新房进行装修并没有改变房屋的本质,但它可以让房子变得更漂亮、更温馨、更实用。 在软件设计中,对已有对象(新房)的功能进行扩展(装修)。 把通用功能封装在装饰器中,用到的地方进行调用。 装饰模式是一种用于替代继承的技术,使用对象之间的关联关系取代类之间的继承关系。引入装饰类,扩充新功能。 角色 抽象构件 具体构件 抽象装饰类 具体装饰类
案例一,窗体装饰

1.组件类

package Decorator; // 装饰者模式

/**

  • Created by Jiqing on 2016/10/13.
    */
    abstract class Component {
    public abstract void display();
    }
    2.组件装饰者

package Decorator;

/**

  • Created by Jiqing on 2016/10/13.
    */
    public class ComponentDecorator extends Component{
    private Component component; // 维持对抽象构件类型对象的引用
    public ComponentDecorator(Component component){
    this.component = component;
    }

public void display() {
component.display();
}

}
3.继承类ListBox

package Decorator;

/**

  • Created by Jiqing on 2016/10/13.
    */
    public class ListBox extends Component{
    public void display() {
    System.out.println("显示列表框!");
    }
    }
    4.继承类TextBox

package Decorator;

/**

  • Created by Jiqing on 2016/10/13.
    */
    public class TextBox extends Component{
    public void display() {
    System.out.println("显示文本框!");
    }
    }
    5.继承类Window

package Decorator;

/**

  • Created by Jiqing on 2016/10/13.
    */
    public class Window extends Component{
    public void display() {
    System.out.println("显示窗体!");
    }
    }
    6.黑框装饰者

package Decorator;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class BlackBoarderDecorator extends ComponentDecorator{
    public BlackBoarderDecorator(Component component) {
    super(component);
    }

public void display() {
this.setBlackBoarder();
super.display();
}

public void setBlackBoarder() {
System.out.println("为构件增加黑色边框!");

}
}
7.滚动条装饰者

package Decorator;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class ScrollBarDecorator extends ComponentDecorator{
    public ScrollBarDecorator (Component component) {
    super(component); // 调用父类构造函数
    }

public void display() {
this.setScrollBar();
super.display();
}

public void setScrollBar() {
System.out.println("为构件增加滚动条!");
}
}
8.客户端调用

package Decorator; // 装饰者模式

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class Client {
    public static void main(String args[]) {
    Component component,componentSB,componentBB;
    component = new Window();
    componentSB = new ScrollBarDecorator(component);
    componentSB.display();
    System.out.println("--------------------");
    componentBB = new BlackBoarderDecorator(componentSB);
    componentBB.display();
    }
    }
    执行结果

为构件增加滚动条!
显示窗体!

为构件增加黑色边框!
为构件增加滚动条!
显示窗体!
422101-20161014225513875-1745462407.png

 案例二,密文装饰

1.密文接口

package Decorator.sample2;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public interface Cipher // 密文接口
    {
    public String encrypt(String plainText);
    }
    2.密文装饰者

package Decorator.sample2;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class CipherDecorator implements Cipher{
    private Cipher cipher;
    public CipherDecorator(Cipher cipher) {
    this.cipher = cipher;
    }

public String encrypt(String plainText) {
return cipher.encrypt(plainText);
}
}
3.密文接口实现类

package Decorator.sample2;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public final class SimpleCipher implements Cipher // 简单密文继承密文
    {
    public String encrypt(String plainText)
    {
    String str="";
    for(int i=0;i<plainText.length();i++)
    {
    char c=plainText.charAt(i);
    if(c>=‘a‘&&c<=‘z‘)
    {
    c+=6;
    if(c>‘z‘) c-=26;
    if(c<‘a‘) c+=26;
    }
    if(c>=‘A‘&&c<=‘Z‘)
    {
    c+=6;
    if(c>‘Z‘) c-=26;
    if(c<‘A‘) c+=26;
    }
    str+=c;
    }
    return str;
    }
    }
    4.复杂加密装饰者

package Decorator.sample2;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class ComplexCipher extends CipherDecorator // 复杂密文
    {
    public ComplexCipher(Cipher cipher)
    {
    super(cipher);
    }

public String encrypt(String plainText)
{
String result=super.encrypt(plainText);
result= this.reverse(result);
return result;
}

public String reverse(String text)
{
String str="";
for(int i=text.length();i>0;i--)
{
str+=text.substring(i-1,i);
}
return str;
}
}
5.先进加密装饰者

package Decorator.sample2;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class AdvancedCipher extends CipherDecorator{
    public AdvancedCipher(Cipher cipher) {
    super(cipher);
    }

public String encrypt(String plainText) { // 加密处理
String result=super.encrypt(plainText);
result=mod(result);
return result;
}

public String mod(String text)
{
String str="";
for(int i=0;i<text.length();i++)
{
String c=String.valueOf(text.charAt(i)%6);
str+=c;
}
return str;
}
}
6.客户端

package Decorator.sample2;

/**

  • Created by Jiqing on 2016/10/14.
    */
    public class Client {
    public static void main(String args[])
    {
    String password="Jiqing9006"; //明文
    String cpassword; //密文
    Cipher sc,ac,cc;

sc=new SimpleCipher();
cpassword=sc.encrypt(password);
System.out.println(cpassword);
System.out.println("---------------------");

cc=new ComplexCipher(sc);
cpassword=cc.encrypt(password);
System.out.println(cpassword);
System.out.println("---------------------");

ac=new AdvancedCipher(cc);
cpassword=ac.encrypt(password);
System.out.println(cpassword);
System.out.println("---------------------");
}
}
执行结果

Powotm9006

6009mtowoP

0003123532

422101-20161014225522812-515626629.png

以上是关于JAVA设计模式之装饰者模式的主要内容,如果未能解决你的问题,请参考以下文章

java设计模式之装饰者模式学习

Java设计模式之装饰者模式

JAVA设计模式之装饰者模式

JAVA设计模式之装饰者模式

Java设计模式之装饰者模式

Java设计模式之装饰者模式