zoukankan      html  css  js  c++  java
  • 5.19Java装饰器设计模式

    5.19Java装饰器设计模式

    之前我们所说的都是节点流,Java当中的节点流就是直接与数据源交互的程序。为了提升性能、操作方便需要进行装饰处理

    设计模式浅谈

    高内聚,低耦合--->常见的设计模式有:单例、工厂、装饰、代理...

    组织代码的固定模式和套路--->固定类、方法等设计

    设计方法
    • 抽象组件--->相当于接口、抽象父类等

    • 具体的组件--->需要装饰的对象

    • 抽象装饰类--->包含了组件的引用,以及装饰着共有的方法

    • 具体装饰类--->被装饰的对象

    IO流当中的装饰是为了后期处理数据类型、对象、缓冲的时候提高性能,方便后期操作

    装饰器例子--->模拟放大器

    抽象组件:

    /**
    * 定义一个接口,里面定义了声音的具体实现方法
    */
    interface Say{
       void say();
    }

    具体组件:

    /**
    * 定义一个接口,里面定义了声音的具体实现方法
    */
    interface Say{
       void say();
    }

    /**
    * 定义一个Person类,实现接口
    */
    class Person implements Say{
       //定义该类有的属性
       private int voice = 10;

       //写一个setBean方法
       public void setVoice(int voice) {
           this.voice = voice;
      }

       //写一个getBean方法
       public int getVoice() {
           return voice;
      }

       //实现接口的方法
       @Override
       public void say(){
           System.out.println("人的声音为:" + this.getVoice());
      }
    }

    抽象装饰类:

    /*
    这个项目中无
    */

    具体装饰器:

    /**
    * 放大器类,放大声音
    */
    class Amplifer implements Say{
       /*实现对人声音的装饰*/
       private Person p;
       /*将这个放大属性放入构造器当中*/
       Amplifer(Person p){
           this.p = p;
      }

       /*实现接口的方法*/
       @Override
       public void say(){
           System.out.println("人的声音为:" + p.getVoice() * 100);
           System.out.println("噪音!!!");
      }
       /*
       加了一个私有属性--->需要放大的类的属性
       再构造器将Person类对象传入
       调用原对象的方法进行处理!!!--->很关键,玩转类跟类的关系
       两个类实现同一个接口,再类与类之间进行方法调用
        */
    }
    模拟咖啡牛奶

    抽象组件--->接口、抽象父类,需要装饰的抽象对象

    /**
    * 抽象组件--->接口
    */
    interface Drink{
       /*费用*/
       double cost();
       /*说明*/
       String info();
    }

    具体的组件--->需要装饰的对象--->具体来说就是上个代码的Person类

    /**
    * 具体组件-->咖啡
    */
    class Coffee implements Drink{
       /*定义类属性*/
       private String name = "原味咖啡";

       /*重写接口当中的方法*/
       @Override
       public double cost(){
           /*原为咖啡的价格*/
           return 10;
      }

       @Override
       public String info(){
           return name;
      }
    }

    抽象装饰类:包含了对抽象组件的引用,以及装饰着共有的方法

    /**
    * 抽象装饰类--->相当于牛奶和糖
    */
    abstract class Decorate implements Drink{
       //对抽象组件的引用
       private Drink drink;
       /*将引用写入构造器中*/
       public Decorate(Drink drink){
           this.drink = drink;
      }

       @Override
       public double cost() {
           return this.drink.cost();
      }

       @Override
       public String info() {
           return this.drink.info();
      }
    }

    具体的装饰类:被装饰的对象

    /**
    * 具体的装饰类--->牛奶
    */
    class Milk extends Decorate {

       public Milk(Drink drink) {
           super(drink);
      }

       /*对其重写抽象类当中的方法*/
       @Override
       public double cost() {
           return super.cost() * 4; //四倍价格
      }

       @Override
       public String info() {
           return super.info() + "加入了牛奶!";
      }
    }

    /**
    * 具体的装饰类--->糖
    */
    class Suger extends Decorate {

       public Suger(Drink drink) {
           super(drink);
      }

       /*对其重写抽象类当中的方法*/
       @Override
       public double cost() {
           return super.cost() * 2; //四倍价格
      }

       @Override
       public String info() {
           return super.info() + "加入了蔗糖!";
      }
    }

     

    It's a lonely road!!!
  • 相关阅读:
    Windows进程/线程创建过程
    固件安全研究
    区块链安全研究的总结
    CoTreatAsClass一些注意事项
    Ring3 读取SSDT
    User Mode Scheduling
    首次异常和二次异常
    offer终于有着落了
    AtomBombing
    Retn
  • 原文地址:https://www.cnblogs.com/JunkingBoy/p/14787051.html
Copyright © 2011-2022 走看看