Java代理设计模式与接口

目录

一、JDK内置的两大接口

1、java.lang.Comparable:比较接口

2、java.lang.Cloneable :克隆接口

二、深浅拷贝

三、代理设计模式

四、源代码 


一、JDK内置的两大接口

1、java.lang.Comparable:比较接口

Student是自定义类型,当使用Arrays.sort对自定义类型进行排序时,自定义类型需要实现Comparable,使其具备可比较的能力。

//compare 接口
public class Student implements Comparable<Student>{//泛型
    private String name;
    private int age;

    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }

    //快捷键 alt + insert
    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public static void main(String[] args){
        Student stu1 = new Student("大喵",26);
        Student stu2 = new Student("二小",12);
        Student stu3 = new Student("三乖",3);
        Student[] students = {stu1,stu2,stu3};
        //数组排序算法,年龄升序排列
        Arrays.sort(students);
        System.out.println(Arrays.toString(students));
    }
   //此时根据年龄大小来比较,升序排列
    public int compareTo(Student o){
        if (this.age == o.age){
            return 0;
        }else if (this.age < o.age){
            return -1;
        }
        return 1;
    }

//    @Override
//    public int compareTo(Student o) {
//        return 0;
//    }
}

2、java.lang.Cloneable :克隆接口

程序中的克隆:复制一个新的对象,新的对象的属性值是从旧对象中拷贝过来的。

//Cloneable 克隆  是标记接口,没有抽象方法
public class Animal implements Cloneable{
    private String name;

    protected Animal clone() throws CloneNotSupportedException{
        return (Animal) super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        Animal animal = new Animal();
        animal.name="zzz";
        Animal animal1 = animal.clone();
        System.out.println(animal == animal1);//false
        System.out.println(animal1.name);//zzz
    }
}

二、深浅拷贝

b1.a.num = 100;//对于b2来说是可见的 -> b1.a和b2.a指向了相同的对象,这种拷贝就称为浅拷贝.
此处的b1和b2确实是两个不同的对象,但是b1和b2内部包含了'A类的引用,这个引用指向相同地址(浅拷贝)
b1和b2内部包含的a确实不是一个对象,这种拷贝称为深拷贝
实现深拷贝的两种方式: a.递归的实现Cloneable          b.通过序列化来进行拷贝   Serializable               将对象转为json字符串(序列化)-都是深拷贝         序列化: 将一个对象转为String

//深浅拷贝
//  用 // 起来的是浅拷贝
class A{
//class A implements Cloneable{
    int num;
//    protected A clone() throws CloneNotSupportedException{
//        return (A) super.clone();
//    }
}

public class B implements Cloneable{
    A a = new A();

    @Override
    protected Object clone() throws CloneNotSupportedException {
//        B newB = (B) super.clone();
//        newB.a = a.clone();
//        return newB;
        return (B) super.clone();
    }

    public static void main(String[] args) throws CloneNotSupportedException {
        B b1 = new B();
        B b2 = (B) b1.clone();

        System.out.println(b1 == b2);//false
        System.out.println(b2.a.num);//0
        b1.a.num = 100;
        System.out.println(b2.a.num);//100 //0
    }
}

三、代理设计模式

代理设计模式:基于接口的一个接口两个实现类, 一个是真实业务类,另一个是辅助真实业务的代理类。最终将真实业务传递给代理类来完成整个业务的实现。(以代购电脑为例)

//业务接口,你要干的事,你要买的东西
interface ISubject{
    //代理核心业务 买个电脑
    void buyComputer();
}

//真正业务类。真正付钱买电脑的那个人
class RealSubject implements ISubject{
    @Override
    public void buyComputer() {
        System.out.println("买个mac pro 15寸顶配,YYDS~");
    }
}

//代理类,辅助我们买电脑
//代理类中有买电脑的辅助操作
class ProxySubject implements ISubject{
    private ISubject realSubject;
    public ProxySubject(ISubject subject){
        this.realSubject = subject;
    }

    public void preHandle(){
        System.out.println("买飞机票去漂亮国~");
    }
    @Override
    public void buyComputer() {
        preHandle();
        //付钱这个操作是由真是业务来处理的
        this.realSubject.buyComputer();
        postHandle();
    }
    public void postHandle(){
        System.out.println("再买飞机票回国,送14+7大礼包(隔离)~");
    }
}

//最终通过平台,将代理人和客户建立联系
class Platform{
    public static ISubject getInstance(){
        //在代购平台上下单
        return new ProxySubject(new RealSubject());
    }
}

public class Subject {
    public static void main(String[] args) {
        ISubject subject = Platform.getInstance();
        subject.buyComputer();
    }
}

四、源代码 

JDK两种内置接口 比较 和 克隆

接口应用 代理设计模式 代购电脑


本小节完^_^

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王嘻嘻-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值