开闭原则

对扩展开放,对修改关闭
大概就是你不要改动你已经写好的代码...比如写好的类

里氏代换原则

任何父类出现的地方子类一定可以出现。多用多态。

依赖倒转原则

尽量多依赖于抽象类和接口。抽象类/接口对子类有强制性

接口隔离原则

尽可能依赖于小接口而不是大接口。避免接口的污染,降低耦合度。

迪米特原则 (最少知识原则)

高内聚,低耦合。
一个实体应该尽量少的与其他实体发生相互作用。使系统功能模块相互独立。

合成复用原则

多用组合/聚合,少用继承

设计模式

分为创建型、结构型、行为型
用于固定场合的固定套路。

单例-懒汉 (没用volatile)

public class Singleton {
    private static Singleton singleton;

    private Singleton(){}

    public static Singleton getSingleton() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

普通工厂

用于处理复杂的创建对象场景。

public interface Sender {
    void send();
}

class MailSender implements Sender {

    @Override
    public void send() {
        System.out.println("sending mail");
    }
}

class EmailSender implements Sender {

    @Override
    public void send() {
        System.out.println("sending email");
    }
}

static class SendFactory {
    //当然,我也可以对每种实现类设计一个创建方法。
    public static Sender produce(String type) {
        if ("mail".equals(type)) {
            return new MailSender();
        }
        if ("email".equals(type)) {
            return new EmailSender();
        }
        return null;
    }
}

抽象工厂

public interface Sender {
    void send();
}

interface Provider {
    Sender produce();
}

class MailSender implements Sender {

    @Override
    public void send() {
        System.out.println("sending mail");
    }
}

class EmailSender implements Sender {

    @Override
    public void send() {
        System.out.println("sending email");
    }
}

class MailSenderFactory implements Provider {

    @Override
    public MailSender produce() {
        return new MailSender();
    }
}

class EmailSenderFactory implements Provider {

    @Override
    public Sender produce() {
        return new EmailSender();
    }
}

就是把生产对象做成一个接口,让不同的工厂实现这个接口。用普通工厂模式的话,日后加新的类你要修改你已有的普通工厂。

装饰器模式

public class DecoratorTest {
    public static void main(String[] args) {
        Sourceable sourceable = new Decorator(new Source());
        sourceable.method();
    }
}

interface Sourceable {
    void method();
}

class Source implements Sourceable {

    @Override
    public void method() {
        System.out.println("本源");
    }
}

class Decorator implements Sourceable {

    private Sourceable sourceable;

    public Decorator(Sourceable sourceable) {
        this.sourceable = sourceable;
    }

    @Override
    public void method() {
        sourceable.method();
        System.out.println("装饰");
    }
}

代理模式

//直接new对象,而不是靠传入参数
class Proxy implements Sourceable {

    private Sourceable source;

    public Proxy() {
        this.source = new Source();
    }

    @Override
    public void method() {
        source.method();
        System.out.println("代理");
    }
}

模板方法模式

//让抽象类封装固定流程,子类具体实现。
public class TemplateTest {
    public static void main(String[] args) {
        AbstractCalculator calculator = new Plus();
        int res = calculator.splitExpression("1+1", "\\+");
        System.out.println(res);
    }
}

abstract class AbstractCalculator {
    public abstract int calculate(int a, int b);
    public int splitExpression(String exp, String op) {
        String[] arr = exp.split(op);
        return calculate(Integer.parseInt(arr[0]), Integer.parseInt(arr[1]));
    }
}

class Plus extends AbstractCalculator {

    @Override
    public int calculate(int a, int b) {
        return a + b;
    }
}

class Minus extends AbstractCalculator {

    @Override
    public int calculate(int a, int b) {
        return a - b;
    }
}