一、介绍
装饰器模式又名包装(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));
}
}