1. 意图
动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活
2. 动机
在某些情况下,我们可能会"过度的使用继承来扩展对象的功能"。继承是静态的,无法在运行时更改已有对象的行为,只能使用由不同子类创建的对象来替代当前的整个对象;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致子类的膨胀
3. 适用性
- 在不影响其他对象的情况下,以动态的、透明的方式给单个对象添加指责
- 当不能采用生成子类的方法进行扩充时。一种情况是,可能有大量独立的扩展,为支持每一种组合将产生大量的子类,使得子类数目呈爆炸性增长。另一种情况是,类定义被隐藏,或类定义不能用于生成子类
- 处理一些可以撤销的职责
4. 结构
5. 效果
1) 比静态继承更加灵活
2) 可以在运行时,添加和删除对象功能
3) 避免在层次结构高层的类有太多的特征
4) 有很多小对象。 对了解系统的人来说,很容易对它们进行定制,但是很难学习这些系统,排错也很困难
6. 代码实现
decorators/DataSource.java: 定义了读取和写入操作的通用数据接口
package decorator.decorators;/** * @author GaoMing * @date 2021/7/12 - 16:48 */public interface DataSource { void writeData(String data); String readData();}
decorators/FileDataSource.java: 简单数据读写器
package decorator.decorators;import java.io.*;/** * @author GaoMing * @date 2021/7/12 - 16:49 */public class FileDataSource implements DataSource{ private String name; public FileDataSource(String name) { this.name = name; } @Override public void writeData(String data) { File file = new File(name); try (OutputStream fos = new FileOutputStream(file)) { fos.write(data.getBytes(), 0, data.length()); } catch (IOException ex) { System.out.println(ex.getMessage()); } } @Override public String readData() { char[] buffer = null; File file = new File(name); try (FileReader reader = new FileReader(file)) { buffer = new char[(int) file.length()]; reader.read(buffer); } catch (IOException ex) { System.out.println(ex.getMessage()); } return new String(buffer); }}
decorators/DataSourceDecorator.java: 抽象基础装饰
package decorator.decorators;/** * @author GaoMing * @date 2021/7/12 - 16:51 */public class DataSourceDecorator implements DataSource{ private DataSource wrappee; DataSourceDecorator(DataSource source) { this.wrappee = source; } @Override public void writeData(String data) { wrappee.writeData(data); } @Override public String readData() { return wrappee.readData(); }}
decorators/EncryptionDecorator.java: 加密装饰
package decorator.decorators;import java.util.Base64;/** * @author GaoMing * @date 2021/7/12 - 16:53 */public class EncryptionDecorator extends DataSourceDecorator{ public EncryptionDecorator(DataSource source) { super(source); } @Override public void writeData(String data) { super.writeData(encode(data)); } @Override public String readData() { return decode(super.readData()); } private String encode(String data) { byte[] result = data.getBytes(); for (int i = 0; i < result.length; i++) { result[i] += (byte) 1; } return Base64.getEncoder().encodeToString(result); } private String decode(String data) { byte[] result = Base64.getDecoder().decode(data); for (int i = 0; i < result.length; i++) { result[i] -= (byte) 1; } return new String(result); }}
decorators/CompressionDecorator.java: 压缩装饰
package decorator.decorators;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.InputStream;import java.util.Base64;import java.util.zip.Deflater;import java.util.zip.DeflaterOutputStream;import java.util.zip.InflaterInputStream;/** * @author GaoMing * @date 2021/7/12 - 16:54 */public class CompressionDecorator extends DataSourceDecorator{ private int compLevel = 6; public CompressionDecorator(DataSource source) { super(source); } public int getCompressionLevel() { return compLevel; } public void setCompressionLevel(int value) { compLevel = value; } @Override public void writeData(String data) { super.writeData(compress(data)); } @Override public String readData() { return decompress(super.readData()); } private String compress(String stringData) { byte[] data = stringData.getBytes(); try { ByteArrayOutputStream bout = new ByteArrayOutputStream(512); DeflaterOutputStream dos = new DeflaterOutputStream(bout, new Deflater(compLevel)); dos.write(data); dos.close(); bout.close(); return Base64.getEncoder().encodeToString(bout.toByteArray()); } catch (IOException ex) { return null; } } private String decompress(String stringData) { byte[] data = Base64.getDecoder().decode(stringData); try { InputStream in = new ByteArrayInputStream(data); InflaterInputStream iin = new InflaterInputStream(in); ByteArrayOutputStream bout = new ByteArrayOutputStream(512); int b; while ((b = iin.read()) != -1) { bout.write(b); } in.close(); iin.close(); bout.close(); return new String(bout.toByteArray()); } catch (IOException ex) { return null; } }}
Demo.java: 客户端代码
package decorator;import decorator.decorators.*;/** * @author GaoMing * @date 2021/7/12 - 17:03 */public class Demo { public static void main(String[] args) { String salaryRecords = "Name,Salary\nJohn S......原文转载:http://www.shaoqun.com/a/892291.html
跨境电商:https://www.ikjzd.com/
usps国际快递查询:https://www.ikjzd.com/w/513
wish:https://www.ikjzd.com/w/105
3suisses:https://www.ikjzd.com/w/412
1.意图 动态的给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活 2.动机 在某些情况下,我们可能会"过度的使用继承来扩展对象的功能"。继承是静态的,无法在运行时更改已有对象的行为,只能使用由不同子类创建的对象来替代当前的整个对象;并且随着子类的增多(扩展功能的增多),各种子类的组合(扩展功能的组合)会导致子类的膨胀 3.适用性在不影响其他对象的情况
primc:https://www.ikjzd.com/w/129
联动优势:https://www.ikjzd.com/w/1921
四川香格里拉与云南香格里拉之比较 :http://www.30bags.com/a/408178.html
四川小吃-玻璃烧麦 - :http://www.30bags.com/a/402217.html
四川小吃-灯影牛肉 - :http://www.30bags.com/a/402219.html
四川小吃-夫妻肺片 - :http://www.30bags.com/a/402221.html
和闺蜜一块伺候男友 二女共侍一夫双飞:http://lady.shaoqun.com/m/a/248078.html
男人爱㖭女人下边 把女人的下面扒开添干净:http://www.30bags.com/m/a/249798.html
深圳宝安科技馆8月展览汇总(持续更新):http://www.30bags.com/a/517601.html
2021时尚深圳展蝶讯馆展览好看吗:http://www.30bags.com/a/517602.html
2021时尚深圳蝶讯馆观展攻略:http://www.30bags.com/a/517603.html
深圳欢乐谷夏浪音乐节有朱星杰吗:http://www.30bags.com/a/517604.html
没有评论:
发表评论