建造者模式 构建数据结构的链表

最近迷上设计模式 这次带来的是建造者模式

1.建造者模式
将复杂的对象构建过程 分解开 降低耦合度,大幅提高可读性
2.建造者和工厂模式
个人理解:
建造者侧重于对象构建的过程,精髓在于director中如何去builer组装对象。
工厂模式侧重于构建对象的结果,客户端代码主要关注的是获取作者规定好的对象。
3.使用场景实例
jdk源码是学习设计模式很好的路径
例如:
jdk中 StringBuilder通过append()拼接 AbstractStringBuilder中的 value[] 字符数组

4.构建链表
先定义链表的节点:

public class LinkedNode<T> {
    /**
     * 数据域
     */
    private T data;
    /**
     * 指针域
     */
    private LinkedNode next;

    public LinkedNode(T data, LinkedNode next) {
        this.data = data;
        this.next = next;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public LinkedNode getNext() {
        return next;
    }

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

链表类:

public class LinkedList<T> {
    /**
     * 节点
     */
    private LinkedNode<T> linkedNode;

    /**
     * 指针
     */
    private LinkedNode<T> temp;

    /**
     * 初始化链表 设置头节点
     *
     * @param linkedNode
     */
    public LinkedList(LinkedNode<T> linkedNode) {
        this.linkedNode = linkedNode;
        temp=linkedNode;
    }

    public LinkedNode<T> getLinkedNode() {
        return linkedNode;
    }

    public void setLinkedNode(LinkedNode<T> linkedNode) {
        this.linkedNode = linkedNode;
    }

    /**
     * 递归获取尾部节点 复杂度先不管先注重建造者模式
     *
     *
     * @return
     */
    public LinkedNode<T> getLastLinkedNode(){
        if(linkedNode==null){
            throw new RuntimeException("尚未初始化头节点");
        }
        if(temp.getNext()!=null){
           temp=temp.getNext();
          return getLastLinkedNode();
        }
        return temp;
    }

    /**
     * 先序遍历
     *
     */
    public void printList(){
        if(linkedNode==null){
            throw new RuntimeException("尚未初始化头节点");
        }
        System.out.println(temp.getData());
        if(temp.getNext()!=null){
            temp=temp.getNext();
            printList();
        }
    }

    /**
     * 翻转指针
     *
     */
    public void flip(){
        this.temp=this.linkedNode;
    }
}

建造者接口

public interface ILinkedListBuilder<T> {

    ILinkedListBuilder buildLinkedList(T data);

    LinkedList<T> getList();

    /**
     * 为了看到效果 加了一个接口
     */
    void print();
}

Integer类型链表建造者 因为指针需要翻转 所以利用了一点装饰模式的思想

public class IntegerLinkedListBuilder implements ILinkedListBuilder<Integer> {
    /**
     * 初始化头节点
     */
    private LinkedList<Integer> ls;

    public IntegerLinkedListBuilder(LinkedList<Integer> ls) {
        this.ls = ls;
    }

    @Override
    public ILinkedListBuilder buildLinkedList(Integer data) {
        ls.getLastLinkedNode().setNext(new LinkedNode(data,null));
        //翻转指针到头结点
        ls.flip();
        return this;
    }

    @Override
    public LinkedList<Integer> getList() {
        return ls;
    }

    @Override
    public void print(){
        ls.printList();
        ls.flip();
    }
}

测试类 可以;理解为director

public class testBuilder {
    public static void main(String[] args) {
        //初始化头节点
        ILinkedListBuilder<Integer> linkedListBuilder=new IntegerLinkedListBuilder(new LinkedList<>(new LinkedNode<>(12,null)));
        //构建链表 类似于 jdk的linkedList.add();但是linkedList不能linkedList.add().add().add()
        linkedListBuilder.buildLinkedList(11).buildLinkedList(10).buildLinkedList(9);
        //得到链表
        LinkedList<Integer> list = linkedListBuilder.getList();
        //打印链表
        linkedListBuilder.print();
    }
}

debug结果:
在这里插入图片描述
从结果看已经形成一条链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值