zoukankan      html  css  js  c++  java
  • 装饰器模式(IO流案例)

    装饰器模式,也成为包装模式,顾名思义,就是对已经存在的某些类进行装饰,以此来扩展一些功能。其结构图如下:

    Component为统一接口,也是装饰类和被装饰类的基本类型。

    ConcreteComponent为具体实现类,也是被装饰类,他本身是个具有一些功能的完整的类。

    Decorator是装饰类,实现了Component接口的同时还在内部维护了一个ConcreteComponent的实例,并可以通过构造函数初始化。而Decorator本身,通常采用默认实现,他的存在仅仅是一个声明:我要生产出一些用于装饰的子类了。而其子类才是赋有具体装饰效果的装饰产品类。

    ConcreteDecorator是具体的装饰产品类,每一种装饰产品都具有特定的装饰效果。可以通过构造器声明装饰哪种类型的ConcreteComponent,从而对其进行装饰。

    装饰模式应用场景

    在IO中,具体构件角色是节点流,装饰角色是过滤流。

    FilterInputStream和FilterOutputStream是装饰角色,而其他派生自它们的类则是具体装饰角色。

    DataoutputStream out=new DataoutputStream(new FileoutputStream());

    这就是 装饰者模式,DataoutputStream是装饰者子类,FileoutputStream是实现接口的子类。

    这里不会调用到装饰者类--FilteroutputStream,只是作为继承的另一种方案,对客户端来说是透明的,是为了功能的扩张.

    装饰与代理区别

    装饰器模式关注于在一个对象上动态的添加方法,然而代理模式关注于控制对对象的访问。换句话 说,用代理模式,代理类(proxy class)可以对它的客户隐藏一个对象的具体信息。因此,当使用代理模式的时候,我们常常在一个代理类中创建一个对象的实例。并且,当我们使用装饰器模 式的时候,我们通常的做法是将原始对象作为一个参数传给装饰者的构造器。

    装饰模式应用场景

    在IO中,具体构件角色是节点流,装饰角色是过滤流。

    FilterInputStream和FilterOutputStream是装饰角色,而其他派生自它们的类则是具体装饰角色。

    DataoutputStream out=new DataoutputStream(new FileoutputStream());

    这就是 装饰者模式,DataoutputStream是装饰者子类,FileoutputStream是实现接口的子类。

    这里不会调用到装饰者类--FilteroutputStream,只是作为继承的另一种方案,对客户端来说是透明的,是为了功能的扩张.

    西餐厅 中餐厅  有自己的模式 有利于推广

    流程化 程序化  西

    中的  油少许 酱油少许   不量化

      装饰 装修下

    步骤:

     获取被装饰类的引用

     在构造方法中传入被装饰类的对象

     对原有功能进行升级

    package com.toov5.test;
    
    interface Coder{
        
        public void code();
        
    }
    
    class Student implements Coder{
    
        @Override
        public void code() {
            System.out.println("会PHP");
        }
        
    }
    
    
    class NewStudent implements Coder{
        private Student s;   //获取学生引用
        
        public NewStudent(Student s) {
            this.s = s;
        }
    
         @Override
        public void code() {
            s.code();  //本身具有的功能
            //对原有的进行升级
            System.out.println("C++");
            System.out.println("Java");
            System.out.println("C#");
        }
         
    }
    
    
    
    public class TestOk6 {
    public static void main(String[] args) throws Exception  {
           Student s = new Student();
           NewStudent newStudent = new NewStudent(s);
           newStudent.code();
      } 
    }

    这样就类似于   BufferedReader(Reader in) 这样的 进行包装 包装的都是 Reader的泛型子类    这样的耦合性低   可以选择 BufferedReader进行包装 也可以选择其他的进行包装

    如果是子父类的话 关系就密切了

    装饰设计模式是:  耦合性不强,被装饰的类的变化与装饰类的变化无关。

  • 相关阅读:
    第五周学习进度条
    课堂实验4.1(环数组)
    每日站立会议(3)
    每日站立会议(2)
    找水王
    购买一批书的最低价格
    每日站立会议(1)
    NABCD分析
    团队开发博客
    返回一个二维整数数组中的最大子数组之和(环)
  • 原文地址:https://www.cnblogs.com/toov5/p/9874556.html
Copyright © 2011-2022 走看看