装饰器模式

一、介绍

装饰器模式又名包装(Wrapper)模式。装饰器模式以对客户端透明的方式拓展对象的功能,是继承关系的一种替代方案。

重点:装饰器模式是继承关系的一种替代方案

在装饰器模式中的角色有:

抽象构件(Component)角色:给出一个抽象接口,已规范准备接收附加责任的对象。

具体构件(ConcreteComponent)角色:定义一个将要接收附加责任的类

装饰(Decorator)角色:持有一个构件(Component)对象的实例,并定义一个与抽象构件接口一致的接口。

具体装饰(ConcreteDecorator)角色:负责给构件对象“贴上”附加的责任

二、示例

package com.example.designmode.demo.decorator;


import com.example.designmode.dto.UserDTO;

import java.util.List;

//抽象构件
public interface AbstractSort {

    void sort(List<UserDTO> list);
}
package com.example.designmode.demo.decorator;


import com.example.designmode.dto.UserDTO;

import java.util.Comparator;
import java.util.List;

//具体构件
public class SortBySexComponent implements AbstractSort {

    @Override
    public void sort(List<UserDTO> list) {
        list.sort(Comparator.comparing(user->((UserDTO)user).getSex()).reversed());
    }
}
package com.example.designmode.demo.decorator;


import com.example.designmode.dto.UserDTO;

import java.util.List;

//抽象装饰器
public class AbstractSortDecorator implements AbstractSort {

    private AbstractSort abstractSort;

    public AbstractSortDecorator(AbstractSort abstractSort) {
        super();
        this.abstractSort = abstractSort;
    }

    @Override
    public void sort(List<UserDTO> list) {
        abstractSort.sort(list);
    }
}
package com.example.designmode.demo.decorator;


import com.example.designmode.dto.UserDTO;

import java.util.Comparator;
import java.util.List;

public class SortByAge extends AbstractSortDecorator {

    public SortByAge(AbstractSort abstractSort) {
        super(abstractSort);
    }

    @Override
    public void sort(List<UserDTO> list) {
        //调用被装饰的类的排序方法
        super.sort(list);
        //同时自己再实现自己排序规则
        list.sort(Comparator.comparing(user->((UserDTO)user).getAge()));
    }
}
package com.example.designmode.demo.decorator;

import com.example.designmode.dto.UserDTO;

import java.util.Comparator;
import java.util.List;


public class SortByState extends AbstractSortDecorator{

    public SortByState(AbstractSort abstractSort) {
        super(abstractSort);
    }

    @Override
    public void sort(List<UserDTO> list) {
        //调用被装饰的类的排序方法
        super.sort(list);
        //同时自己再实现自己排序规则
        list.sort(Comparator.comparing(user->((UserDTO)user).getState()));
    }
}

测试类:

package com.example.designmode.demo.decorator;


import com.example.designmode.dto.UserDTO;

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        //加入下面就是源代码部分
        List<UserDTO> list = new ArrayList<UserDTO>();
        UserDTO user = new UserDTO("张三", "男", 18, "1");
        UserDTO user1 = new UserDTO("李四1", "男", 17, "2");
        UserDTO user2 = new UserDTO("李四2", "男", 12, "8");
        UserDTO user3 = new UserDTO("李四3", "男", 13, "3");
        UserDTO user4 = new UserDTO("李四4", "男", 14, "4");
        UserDTO user5 = new UserDTO("张曼玉2", "女", 15, "5");
        UserDTO user6 = new UserDTO("张曼玉1", "女", 16, "6");
        UserDTO user7 = new UserDTO("张曼玉3", "女", 17, "7");
        UserDTO user8 = new UserDTO("李四5", "男", 18, "8");
        list.add(user);
        list.add(user1);
        list.add(user2);
        list.add(user3);
        list.add(user4);
        list.add(user5);
        list.add(user6);
        list.add(user7);
        list.add(user8);
        //这里就是我要加的排序代码
        AbstractSort sort = new SortByAge(new SortBySexComponent());
        AbstractSort sort1 = new SortByState(sort);
        //这里的调用顺序是:先调用性别类中的根据性别排序,再调用根据年龄排序,最后调用根据状态排序
        sort1.sort(list);
        list.forEach(a->System.out.println(a));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值