尺有所短,寸有所长,物有所不足,智有所不明。

迭代器模式

定义:以一种一致的对集合内的元素进行遍历,而不用在乎集合内的数据结构
ArrayList   数组
LinkedList  链表
HashSet     数组+链表
TreeSet     二叉搜索树-》红黑树

public class Test {
    public static void main(String[] args) {
        //定义:以一种一致的对集合内的元素进行遍历,忽略底层数据结构
        //ArratList    底层    数组
        //LinkedList           链表
        //HashSet             数组+链表
        //Treeset       二叉搜索树->红黑树
        ArrayList<Integer> integers = new ArrayList<>();
        integers.add(2);
        integers.add(3);
        integers.add(5);
        //两种遍历模式
        for (Integer integer : integers) {
            System.out.println(integer);
        }
        Iterator<Integer> iterator = integers.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }

        }
    }

原型模式

原型模式就是讲一个对象作为原型,使用clone()方法来创建新的实例。

 

浅拷贝——>对象的属性仅仅是复制了地址,没有把内容新复制一份

public class User implements Cloneable {
    //实现接口,
    //浅拷贝
    private String name;
    private  int age;
    private Data Birthday;


    public Data getBirthday() { return Birthday;
    }
    public void setBirthday(Date birthday) { Birthday = (Data) birthday;
    }

    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    // 重写父类Obj的一个方法(克隆方法g)
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

深拷贝——>拷贝一份内容,而不是地址。



import java.io.*;
import java.util.Date;

public class User2 implements Cloneable,Serializable {
    private String name;
    private int age;
    private Date bir;

    public String getName() { return name;
    }
    public void setName(String name) { this.name = name;
    }
    public int getAge() { return age;
    }
    public void setAge(int age) { this.age = age;
    }
    public Date getBir() { return bir;
    }
    public void setBir(Date bir) { this.bir = bir;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        try {
            //当前对象写入输出流
            new ObjectOutputStream(os).writeObject(this);
            //拿到字节数组
            byte[] bytes = os.toByteArray();
            ByteArrayInputStream is = new ByteArrayInputStream(bytes);
            //对象输入流
            ObjectInputStream ois = new ObjectInputStream(is);
            return ois.readObject();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {

        }
        return null;
    }
}



import java.util.Date;

public class TestPrototype {
    //根据已经有的对象,创建新的对象
    //克隆
    public static void main(String[] args) throws CloneNotSupportedException {

    }
    private static void copy() throws CloneNotSupportedException {
        User user = new User();
        user.setName("张三");
        user.setAge(12);
        user.setBirthday(new Date());
        User cloneuser = (User) user.clone();
        cloneuser.setBirthday(new Date(28));
        System.out.println(user == cloneuser);//false  说明不知一个对象,克隆成功。
        System.out.println(cloneuser.getAge());//12
        System.out.println(cloneuser.getName());//张三
        //当对象属性非常多,希望新创建的对象属性从已有的复制过来
        // 而不是重新复制,使用原型模式(克隆)
        // 修改其中的属性
        System.out.println(cloneuser.getBirthday());
    }
}

 

建造器模式

了解之前,先假设有一个问题,我们需要创建一个Person对象,属性有name,,sex,age,weight,height等属性,如果每一个属性都可以为空,也就是说我们可以只用一个name,也可以用一个weight,height,或者一个sex,age或者其他任意的赋值来创建一个学生对象,这时该怎么构造?

  难道我们写6个1个输入的构造函数,15个2个输入的构造函数.......吗?这个时候就需要用到Builder模式了。给个例子,大家肯定一看就懂:

Person类



public class Person {
    private String name;
    private String sex;
    private Integer weight;
    private Integer height;

    public Person(String name, String sex, Integer weight, Integer height) {

    }

    //建造器
    public static class PersonBuider{
        private String name;
        private String sex;
        private Integer weight;
        private Integer height;
        //返回值不再是void 而是建造器本身
        public PersonBuider name(String name){
            this.name=name;
            return this;
        }
        public PersonBuider sex(String sex){
            this.sex=sex;
            return this;
        }
         public PersonBuider weight(Integer weight){
            this.weight=weight;
            return this;
            }

        @Override
        public String toString() {
            return "PersonBuider{" +
                    "name='" + name + '\'' +
                    ", sex='" + sex + '\'' +
                    ", weight=" + weight +
                    ", height=" + height +
                    '}';
        }

        public PersonBuider height(Integer height){
                this.height=height;
                return this;
          }
          public Person build(){
            //需要的信息收集齐了
            return new Person(this.name,this.sex,this.weight,this.height);
        }
    }
    public String getName() {
        return name;
    }

    public String getSex() {
        return sex;
    }

    public Integer getWeight() {
        return weight;
    }

    public Integer getHeight() {
        return height;
    }
}

实现输出结果

package com.westos.Builder;

public class TestBuider {
    public static void main(String[] args) {
        Person.PersonBuider personBuider = new Person.PersonBuider().name("Jim").sex("nan").height(185).weight(88);
        System.out.println(personBuider.toString());
        //PersonBuider{name='Jim', sex='nan', weight=88, height=185}

    }
}

装饰模式(Decorator)

给一类对象增加新的功能,装饰方法与具体的内部逻辑无关。


//装饰模式
//给一类对象增加新的功能,装饰方法与具体的内部逻辑无关
interface Source{void mathod();}
public class Decorator implements Source {
    private Source source;
    public void decotate1(){
        System.out.println("decorate");
    }
    @Override
    public void mathod() {
        decotate1();
        source.mathod();
    }





}