Java设计模式,结构型(三)(享元模式,组合模式)

12 篇文章 0 订阅
12 篇文章 0 订阅

享元模式

当需要多个对象但是每个对象仅有部分数据不同时可以使用享元模式,本质上就是使用一个容器将对象储存起来,使用的时候从中获取,常用的容器时HashMap。
棋接口:

public interface Chess {
 void setNum(int num);
}

围棋实现类:

public class WeiQi implements Chess {
    private String name;
    private int num;
    public WeiQi(String name) {
        this.name = name;
    }
    @Override
    public void setNum(int num) {
        this.num=num;
    }
    public int getNum() {
        return num;
    }
}

获取棋子工厂类


public class ChessFactory {
    HashMap<String, WeiQi> chessHashMap = new HashMap<>();

    public WeiQi getChess(String name) {
        if (chessHashMap.get(name) == null) {
            chessHashMap.put(name, new WeiQi(name));
        }
        return chessHashMap.get(name);
    }
    public int getSize(){
        return chessHashMap.size();
    }
}

实现类:

public class MyClass {
    public static void main(String[] args) {
        ChessFactory chessFactory = new ChessFactory();
        WeiQi chess = chessFactory.getChess("黑棋");
        chess.setNum(2);
        System.out.println(chess.getNum());
        WeiQi chess2 = chessFactory.getChess("黑棋");
        chess2.setNum(3);
        System.out.println(chess2.getNum());
        WeiQi chess3 = chessFactory.getChess("黑棋");
        chess3.setNum(4);
        System.out.println(chess3.getNum());
        WeiQi chess4 = chessFactory.getChess("白棋");
        chess4.setNum(5);
        System.out.println(chess4.getNum());
        WeiQi chess5 = chessFactory.getChess("白棋");
        chess5.setNum(6);
        System.out.println(chess5.getNum());
        WeiQi chess6 = chessFactory.getChess("白棋");
        System.out.println(chess6.getNum());

    //    System.out.println(chessFactory.getSize());
    }
}

组合模式

将对象组合成树形,类似于文件系统。分为组合部件,为所有内容提供统一的实现,叶子节点,不能包含内容,类比文件,合成部件,可以包含合成部件以及叶子,类比于目录。

public abstract class Entry {
    public String name;

    public Entry(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void add(Entry entry) {
    }

    public abstract void prt(String pre);

}

文件

public class File extends Entry{

    public File(String name) {
        super(name);
    }

    @Override
    public void prt(String  pre) {
        System.out.print(pre+"/"+getName());
    }

}

目录:


public class Direcrory extends Entry {
    LinkedList<Entry> entries = new LinkedList<>();

    public Direcrory(String name) {
        super(name);
    }

    @Override
    public void add(Entry entry) {
        entries.add(entry);
    }

    @Override
    public void prt(String pre) {
        System.out.println(pre + "/" + getName());
        for (Entry entry : entries) {

            entry.prt(pre + "/" + getName());
        }

    }
}

测试

public class MyClass {
    public static void main(String[] args){
        File file=new File("txt");
        Direcrory home=new Direcrory("home");
        Direcrory wghcwc=new Direcrory("wghcwc");
        Direcrory var=new Direcrory("var");
        Direcrory etc=new Direcrory("etc");
        Direcrory bin=new Direcrory("bin");
        Direcrory opt=new Direcrory("opt");
        home.add(var);
        home.add(wghcwc);
        home.add(file);
        var.add(opt);
        var.add(etc);
        etc.add(bin);
        home.prt("");

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值