Java中的这些 设计模式 你一定都知道吧

前言

为什么我们需要学习设计模式呢?
这很明显,这就跟我们看别人的代码来学习一样,是为了学习里面的精髓。每一本设计模式的书都会告诉你,这些都是在讲究如何对修改封闭,对扩展开放的事情。

我们学设计模式,是为了学习 如何合理的组织我们的代码,如何解耦,如何真正的达到对修改封闭对扩展开放的效果。设计模式学会了,你就会发现在写代码的时候,之前感觉复杂且难以排布的代码都有很好的思路去安排了。

在面试中,常遇到的设计模式相关的问题,只有思路理清了,回答才能顺畅起来。

创建型 模式

简单工厂


class Factory {
    public static Product createProduct(String type) {
        Product productInstance = null;

        switch (type) {
            case "A":
                productInstance = new ProductA();
                break;
            case "B":
                productInstance = new ProductB();
                break;
            default:
                System.out.println("no this type")
                break;
        }
        return productInstance;
    }
}

abstract class Product {
    public abstract void info();
}

class ProductA extends Product {
    @Override // 方法重写
    public void info() {
        System.out.println("this is AAA")
    }
}

class ProductB extends Product {
    @Override
    public void info() {
        System.out.println("this is BBB")
    }
}

工厂方法


interface Factory{
    public Product createProduct();
}

class FactoryA implements Factory {
    @Override
    public Product createProduct() {
        return new ProductA();
    }
}

class FactoryB implements Factory {
    @Override
    public Product createProduct() {
        return new ProductB();
    }

}

interface Product {
    public void info();
}

class ProductA implements Product {
    @Override // 方法重写
    public void info() {
        System.out.println("this is AAA")
    }
}

class ProductB implements Product {
    @Override
    public void info() {
        System.out.println("this is BBB")
    }
}

抽象工厂

interface Factory{
    public AbstractProductA CreateProductA();
    public AbstractProductB CreateProductB();
}

class ConcreateFactory1 implements Factory {
    @Override
    public AbstractProductA CreateProductA() {
        return new ProductA1();
    }

    @Override
    public AbstractProductB CreateProductB() {
        return new ProductB1();
    }
}

class ConcreateFactory2 implements Factory {
    @Override
    public AbstractProductA CreateProductA() {
        return new ProductA2();
    }

    @Override
    public AbstractProductB CreateProductB() {
        return new ProductB2();
    }
}

interface AbstractProductA {
    public void info();
}

interface AbstractProductB {
    public void info();
}

class ProductA1 implements AbstractProductA {
    @Override // 方法重写
    public void info() {
        System.out.println("this is A1")
    }
}
class ProductA2 implements AbstractProductA {
    @Override // 方法重写
    public void info() {
        System.out.println("this is A2")
    }
}

class ProductB1 implements AbstractProductB {
    @Override // 方法重写
    public void info() {
        System.out.println("this is B1")
    }
}
class ProductB2 implements AbstractProductB {
    @Override // 方法重写
    public void info() {
        System.out.println("this is B2")
    }
}

生成器

/* 使用:
    Director director = new Director();
    
    Builder builder1 = new Builder1();
    director.Construct(builder1)
*/


class Director {
    public void Construct(Builder builder) {
        builder.BuildPart();
    }
}

abstract class Builder {
    public abstract void BuildPart();
    public abstract Product getResult();
}

class Builder1 extends Builder {
    Product productInstance = new Product();

    @Override
    public void BuildPart() {
        productInstance.SetFeilds("tom", "man") //初始化方案一
    }

    @Override
    public Product getResult() {
        return Product
    }

}

class Builder2 extends Builder {
    Product productInstance = new Product();

    @Override
    public void BuildPart() {
        productInstance.SetFeilds("cat","woman") //初始化方案二
    }

    @Override
    public Product getResult() {
        return Product
    }

}

class Product {
    public String name = "";
    public String sex = "";

    public void SetFeildsOfName(String caller, String gender) {
        this.name = caller
        this.sex = gender
    }

    public void show() {
        System.out.println(this)
    }
}

原型实例

interface Prototype {
    public Object Clone();
}

class Product implements Prototype {
    private int id;
    private double price;

    public Product(int id, double price) {
        this.id = id;
        this.price = price;
    }

    public int getId() {
        return id
    }

    public double getPrice() {
        return price
    }

    @Override
    public Object Clone() {  //有个该方法, 无需 对象 的 类, 也能 创建出一个 新的 对象。
        Product obj =  new Product();
        obj.id = this.id;
        obj.price = this.price;

        return obj;
    }
}


单例

/**
Singleton obj1 = Singleton.getInstance();
Singleton obj2 = Singleton.getInstance();
Singleton obj3 = Singleton.getInstance();

说明: obj1, obj2, obj3 指向 同一个 对象地址, 确保了 只有一个 实例

*/


class Singleton{
    // 这一步是为了确保 只能有一个实例, 即 类名的 同名方法 如果是 private, 则不能通过 new 的方式创建对象
    private Singleton(){}  

    // 静态方法 只能使用 静态变量, 所以这里 将 instance 设置为 静态变量
    private static Singleton instance = new Singleton();

    // 该方法  就是 全局访问点
    public static Singleton getInstance() {
        return instance
    }
}

结构性 模式

适配器


/*
    将 TypeC 适配 USB 可用的地方

    USB usb = new Adapter();
    usb.Request();

*/

class USB {
    public void Request() {
        System.out.println("USB")
    }
}

class Adapter extends USB {
    private TypeC typeC = new TypeC();

    @Override
    public void Request() {
        typeC.SpecialRequest();
    }
}

class TypeC {
    public void SpecialRequest() {
        System.out.println("TyoeC")
    }
}

桥接


/**
    调用:

        计算儿童票价
        People kid = new Children();

        Tickets aTickets = new ATickets(kid);
        System.out.println("A景区儿童票=" + aTickets.getMoney());

        Tickets bTikcets = new BTickets(kid);
        System.out.println("B景区儿童票=" + bTikcets.getMoney());



        计算老人票价
        People older = new OlderPeople();

        aTickets = new ATickets(olderPeople);
        System.out.println("A景区老人票=" + aTickets.getMoney());
        
        bTikcets = new BTickets(olderPeople);
        System.out.println("B景区老人票=" + bTikcets.getMoney());
*/

//People接口类
public interface People { 
    String getSale();
}

// 儿童类
public class Children implements People {
    @Override
    public String getSale() {
        return "0.6"; //儿童票6折
    }
}

// 老人类
public class OlderPeople implements People {
    @Override
    public String getSale() {
        return "0.5"; // 老人票5折
    }
}

// 门票接口类
public interface Tickets {
    int getMoney();
}

// A景区门票类
public class ATickets implements Tickets{

    private People people;

    public ATickets(People people) {
        this.people = people;
    }

    @Override
    public int getMoney() {
        String sale = people.getSale(); // 获得折扣
        BigDecimal saleBigDecimal = new BigDecimal(sale); // java小数计算会丢失精度,要用BigDecimal来计算
        BigDecimal ticketsBigDecimal = new BigDecimal("100"); // a景区门票原价100
        return ticketsBigDecimal.multiply(saleBigDecimal).intValue(); // 原价门票乘以折扣
    }
}

// B景区门票类
public class BTickets implements Tickets{

    private People people;

    public BTickets(People people) {
        this.people = people;
    }

    @Override
    public int getMoney() {
        String sale = people.getSale(); // 获得折扣
        BigDecimal saleBigDecimal = new BigDecimal(sale); // java小数计算会丢失精度,要用BigDecimal来计算
        BigDecimal ticketsBigDecimal = new BigDecimal("150"); // b景区门票原价100
        return ticketsBigDecimal.multiply(saleBigDecimal).intValue(); // 原价门票乘以折扣
    }
}

组合

/**
    调用:

    EmployeeA1 employeeA1 = new EmployeeA1(25); // 部门A下的1号员工,假设为 25岁
    EmployeeA2 employeeA2 = new EmployeeA2(26); // 部门A下的2号员工
    EmployeeB1 employeeB1= new EmployeeB1(30); // 部门B下的1号员工
    EmployeeB2 employeeB2= new EmployeeB2(30); // 部门B下的2号员工
    
    DepartmentB departmentB = new DepartmentB(); // 组装部门B
    departmentB.add(employeeB1);
    departmentB.add(employeeB2);
    
    DepartmentA departmentA = new DepartmentA(); // 组装部门A
    departmentA.add(employeeA1);
    departmentA.add(employeeA2);
    departmentA.add(departmentB);// 部门B也属于部门A
    
    // 查看 总的 年龄
    System.out.println(departmentA.getAge())
    
*/

// 公司接口类
public interface Company {
    int getAge();
}

// 员工类,这里只放员工A1的代码实现,其他员工的代码和这个一样
public class EmployeeA1 implements Company {
    private int age;

    public EmployeeA1(int age) {
        this.age = age;
    }

    @Override
    public int getAge() {
        return this.age;
    }
}

// 部门类,这里只放部门A的代码实现,部门B和这个一样
public class DepartmentA implements Company {

    private List<Company> list = new ArrayList<>();
    private String name;

    public void add(Company company) {
        list.add(company);
    }

    @Override
    public int getAge() { // 统计部门下所有员工的年龄总和
        int age = 0;
        for (Company company : list) {
            age = age + company.getAge();
        }
        return age;
    }
}

代理


interface Subject {
    public void buy();
}

class Proxy implements Subject {
    protected RealSubject realSubject;

    public Proxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void buy() {
        System.out.println("付钱 前 代理要做的一些事");

        System.out.println("付钱");

        System.out.println("付钱 后 代理要做的一些事");
    }
}


class RealSubject implements Subject {
    @Override
    public void buy() {
        System.out.println("付钱");
    }
}


行为性 模式

责任链

/**
    调用:
    Handler 辅导员 = new FuDaoYuan();
    Handler 系主任 = new XiZhuRen();
    Handler 校长 = new XiaoZhang();

    // 设计 责任链
    辅导员.setNext(系主任)
    系主任.setNext(校长)

    // 使用 责任链
    int request = 100;  // 100天假 的请求
    辅导员.HandlerRquest(request);

*/


abstract class Handler {
    protected Handler next;

    public void setNext(Handler next) {
        this.next = next;
    }

    public abstract void HandlerRquest(int request);
}

class FuDaoYuan extends Handler {
    @Override
    public void HandlerRquest(int request) {
        if (request  < 7) {
            System.out.println("辅导员 审批通过")
        } else {
            if (next != null) { // 如果责任链 还有 后继, 则向后传递请求
                // 传递 请求
                next.HandlerRquest(request);
            } else {
                System.out.println("无法 处理 该请求")
            }
        }
    }
}


class XiZhuRen extends Handler {
    @Override
    public void HandlerRquest(int request) {
        if (request  < 30) {
            System.out.println("系主任 审批通过")
        } else {
            if (next != null) { // 如果责任链 还有 后继, 则向后传递请求
                // 传递 请求
                next.HandlerRquest(request);
            } else {
                System.out.println("无法 处理 该请求")
            }
        }
    }
}


class XiaoZhang extends Handler {
    @Override
    public void HandlerRquest(int request) {
        if (request  < 300) {
            System.out.println("校长 审批通过")
        } else {
            if (next != null) { // 如果责任链 还有 后继, 则向后传递请求
                // 传递 请求
                next.HandlerRquest(request);
            } else {
                System.out.println("无法 处理 该请求")
            }
        }
    }
}

命令

/**
    调用:
    Tv tv = new Tv();

    Command 开机 = new OnCommand(tv);
    Command 关机 = new OffCommand(tv);

    Invoker invoker = new Invoker();

    invoker.setCommand(onCommand) ;
    invoker.call();

    invoker. setCommand (offCommand) ;
    invoker.call();

*/

class Invoker { 
    private Command command;

    public void setCommand(Command command) {
        this.command = command;
    }

    public void call() {
        command.Execute();
    }

}


interface Command {
    public void Execute(); // 执行命令
}

class OnCommand implements Command { // 开机命令
    private Tv tv;

    public OnCommand(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void Execute() {
        tv.OnAction();
    }
}

class OffCommand implements Command { // 关机命令
    private Tv tv;

    public OffCommand(Tv tv) {
        this.tv = tv;
    }

    @Override
    public void Execute() {
        tv.OffAction();
    }
}

class Tv {
    public void OnAction() { // 开机行为
        System.out.println("开机了....")
    }

    public void OffAction() { // 关机行为
        System.out.println("关机了....")
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值