开闭原则
对扩展开放,对修改关闭
大概就是你不要改动你已经写好的代码...比如写好的类
里氏代换原则
任何父类出现的地方子类一定可以出现。多用多态。
依赖倒转原则
尽量多依赖于抽象类和接口。抽象类/接口对子类有强制性
接口隔离原则
尽可能依赖于小接口而不是大接口。避免接口的污染,降低耦合度。
迪米特原则 (最少知识原则)
高内聚,低耦合。
一个实体应该尽量少的与其他实体发生相互作用。使系统功能模块相互独立。
合成复用原则
多用组合/聚合,少用继承
设计模式
分为创建型、结构型、行为型
用于固定场合的固定套路。
单例-懒汉 (没用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;
}
}

京公网安备 11010502036488号