2021年7月29日星期四

装饰模式(学习笔记)

  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

没有评论:

发表评论