这是我参与「第四届青训营 」笔记创作活动的第12天
结构型模式
适配器模式
- 作用:将一个类接口转换成需要的另一个接口。
public void Computer{
public void linked(){
System.out.println("linked!");
}
}
public class Phone{
public void usbline(LinkedLine line){
line.shift();
}
}
public class LinkedLine implements Usb_to_TypeC{
private Computer computer;
public LinkedLine(Computer computer){
this.computer = computer;
}
@Override
public void shift(){
computer.linked();
}
}
public interface Usb_to_TypeC{
public void shift();
}
桥接模式
- 作用:将抽象与实现分离,使他们可以独立变化
- 优势:比继承减少了子类个数,降低维护成本;提高系统可扩充性,符合开闭原则
- 劣势:增加系统理解和设计的难度 运用场景:一个类存在两个独立变化的维度
//苹果
class Apple implements Brand{
@Override
public void output(){
System.out.println("Apple");
}
}
//台式机
class Desktop extends Computer{
public Desktop(Brand brand){ super(brand); }
@Override
public void output(){
brand.output();
System.out.println(" Desktop");
}
}
//电脑抽象类
public abstract class Computer{
protected Brand brand;
public Computer(Brand brand){ this.brand = brand }
public void output(){
brand.output();
}
}
//用户
Computer computer = new Desktop(new Apple());
computer.output();
外观模式
- 作用:提供一个统一的接口,用于访问子系统的一群接口,从而让子系统更容易使用
- 外观类里面的方法用于控制子系统的接口使用顺序
代理模式
- 作用:相当于中介,为其他对象提供一种代理以控制对这个对象的访问。在某些情况下,一个对象不适合或者不能直接引用另一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。
- 优点:业务逻辑清晰;有高扩展性,符合开闭原则
- 静态代理:程序运行前,代理类就已经写好
- 动态代理:运行时由JVM反射机制自动生成
组合模式
- 作用:将对象组合成树形结构以表示"部分-整体"的层次结构,用于把一组相似的对象当作一个单一的对象
- 优点:调用简单;高扩展性,符合开闭原则
- 缺点:叶子和树枝都是实现类,违反依赖倒置原则
class Composite implements Counter{
private List<Counter> counterList = new ArrayList<>();
@Override
public int count(){
int sum = 0;
for(Counter counter : counterList){
sum += counter.count();
}
return sum;
}
}
class Phone implements Counter{
private String name;
private int sum = 1;
@Override
public int count(){
return sum;
}
}
public public static void main(String[] args) {
Composite phone = new Composite();
phone.add(new Phone("苹果"));
phone.add(new Phone("华为"));
Composite xiaomi = new Composite();
xiaomi.add(new Phone("Max"));
xiaomi.add(new Phone("Mix"));
phone.add(xiaomi);
System.out.println(phone.count());
}