两种语言实现设计模式(C++和Java)(十二:组合模式)

组合模式,将对象组合成属性结构以表示‘部分-整体’的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。其UML图如下:

主要解决:它在我们树型结构的问题中,模糊了简单元素和复杂元素的概念,客户程序可以像处理简单元素一样处理复杂元素,从而使得客户程序与复杂元素的内部结构解耦。
如何解决:树枝和树叶实现统一接口,树枝内部组合该接口。
关键代码:树枝内部组合该接口,并且含有内部属性list,里面放Component。

可以用组合模式来表述大学里学院之间的关系,例如工程学院包含机械学院和计算机学院,代码如下:

C++代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <list>
 4 
 5 using namespace std;
 6 
 7 class College{
 8 protected:
 9     string name;
10 public:
11     College(string _name){
12         name = _name;
13     }
14     virtual void add(College* p) = 0;
15     virtual void remove(string name) = 0;
16     virtual void display() = 0;
17     string getName(){
18         return this->name;
19     }
20 };
21 
22 class ConcreteCollege: public College{
23 public:
24     ConcreteCollege(string _name): College(_name){}
25     void add(College* p){
26         shared_ptr<College> temp(p);
27         listCollege.push_back(temp);
28     }
29     void remove(string name){
30         auto it = listCollege.begin();
31         for(it; it != listCollege.end(); it++){
32             shared_ptr<College> temp(*it);
33             string strName = temp->getName();
34             if(name == strName){
35                 listCollege.erase(it);
36             }
37         }
38     }
39     void display(){
40         cout << this->getName()<< endl;
41         for (auto it = listCollege.begin(); it != listCollege.end(); it++){
42             (*it)->display();
43         }
44     }
45 private:
46     vector<shared_ptr<College>> listCollege;
47 };
48 
49 int main()
50 {
51     College *c1 = new ConcreteCollege("Engineering College");
52     c1->add(new ConcreteCollege("Mechanical College"));
53     c1->add(new ConcreteCollege("Computer College"));
54     c1->display();
55     return 0;
56 }

这里使用了shared_ptr智能指针避免delete带来的麻烦

 

Java代码

 1 public interface ICollege {
 2     public void add(ICollege iCollege);
 3     public void delete(ICollege iCollege);
 4     public void display();
 5 }
 6 
 7 public class College implements ICollege {
 8 
 9     private String name;
10 
11     private ArrayList<ICollege> listCollege;
12 
13     public String getName(){return this.name;}
14 
15     public College(String name){
16         listCollege = new ArrayList<ICollege>();
17         this.name = name;
18     }
19 
20     public void add(ICollege iCollege) {
21         listCollege.add(iCollege);
22     }
23 
24     public void delete(ICollege iCollege) {
25         listCollege.remove(iCollege);
26     }
27 
28     public void display() {
29         System.out.println(name);
30         for (ICollege iCollege:
31              listCollege) {
32             iCollege.display();
33         }
34     }
35 }
36 
37 public class Main {
38     public static void main(String[] args) {
39         ICollege c = new College("Engineering College");
40         c.add(new College("Mechanical College"));
41         c.add(new College("Computer College"));
42         c.display();
43     }
44 }

 

转载于:https://www.cnblogs.com/Asp1rant/p/11186207.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值