11.19 实验十三享元模式 实验十四代理模式

实验13:享元模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解享元模式的动机,掌握该模式的结构;
2、能够利用享元模式解决实际问题。

[实验任务一]:围棋
设计一个围棋软件,在系统中只存在一个白棋对象和一个黑棋对象,但是它们可以在棋盘的不同位置显示多次。
实验要求:
1.提交类图;
2.提交源代码;
3.注意编程规范;
4.要求用简单工厂模式和单例模式实现享元工厂类的设计。
image

package org.example;

class BlackIgoChessman extends IgoChessman{
    @Override
    public String getColor() {
        // TODO Auto-generated method stub
        return "黑色";
    }
}
package org.example;

public class Client {
    public static void main(String[] args) {
        IgoChessman black1,black2,black3,white1,white2;
        IgoChessmanFactory factory;
        factory = IgoChessmanFactory.getInstance();
        black1 = factory.getIgoChessman("b");
        black2 = factory.getIgoChessman("b");
        black3 = factory.getIgoChessman("b");
        System.out.println("判断两颗黑棋是否相同:"+(black1==black2));
        white1 = factory.getIgoChessman("w");
        white2 = factory.getIgoChessman("w");
        System.out.println("判断两颗白棋是否相同:"+(white1==white2));
        black1.locate(new Coordinates(1, 1));
        black2.locate(new Coordinates(2, 4));
        black3.locate(new Coordinates(2, 3));
        white1.locate(new Coordinates(3, 5));
        white2.locate(new Coordinates(2, 6));
    }
}
package org.example;

public class Coordinates {
    private int x;
    private int y;
    public Coordinates(int x,int y) {
        // TODO Auto-generated constructor stub
        this.x = x;
        this.y = y;
    }
    public int getX() {
        return x;
    }
    public void setX(int x) {
        this.x = x;
    }
    public int getY() {
        return y;
    }
    public void setY(int y) {
        this.y = y;
    }
}
package org.example;

public abstract class IgoChessman {
    public abstract String getColor();
    public void locate(Coordinates coord){
        System.out.println("棋子颜色:"+this.getColor()+",棋子位置:"+coord.getX()+","+coord.getY());
    }
}
package org.example;
import java.util.Hashtable;

public class IgoChessmanFactory {
    private static IgoChessmanFactory instance = new IgoChessmanFactory();
    private static Hashtable ht;
    public IgoChessmanFactory() {
        // TODO Auto-generated constructor stub
        ht = new Hashtable();
        IgoChessman black,white;
        black = new BlackIgoChessman();
        ht.put("b", black);
        white = new WhiteIgoChessman();
        ht.put("w", white);
    }
    public static IgoChessmanFactory getInstance(){
        return instance;
    }
    public static IgoChessman getIgoChessman(String color){
        return (IgoChessman)ht.get(color);
    }
}
package org.example;

class WhiteIgoChessman extends IgoChessman{
    @Override
    public String getColor() {
        // TODO Auto-generated method stub
        return "白色";
    }
}

实验14:代理模式
本次实验属于模仿型实验,通过本次实验学生将掌握以下内容:
1、理解代理模式的动机,掌握该模式的结构;
2、能够利用代理模式解决实际问题。

[实验任务一]:婚介所
婚介所其实就是找对象的一个代理,请仿照我们的课堂例子“论坛权限控制代理”完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示“对不起,不能早恋!”,并终止业务。
实验要求:

  1. 提交类图;
  2. 提交源代码;
  3. 注意编程规范。
    image
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def getName(self):
        return self.name

    def getAge(self):
        return self.age


class MarriageAgency:
    def findPartnerFor(self, person):
        print(f"正在为{person.getName()}寻找合适的伴侣...")
        # 这里可以添加实际寻找伴侣的复杂逻辑,比如从数据库查询、匹配条件等
        # 暂时只做简单示意,假设找到了一个虚拟伴侣
        print(f"为{person.getName()}找到了一个潜在的伴侣。")


class MarriageAgencyProxy:
    def __init__(self, agency):
        self.agency = agency

    def findPartnerFor(self, person):
        if person.getAge() < 18:
            print("对不起,不能早恋!")
            return
        self.agency.findPartnerFor(person)


class Client(Person):
    def seekPartner(self):
        agency_proxy = MarriageAgencyProxy(MarriageAgency())
        agency_proxy.findPartnerFor(self)


if __name__ == "__main__":
    # 创建一个年龄大于等于18岁的客户示例
    client1 = Client("张三", 25)
    print("张三 25岁")
    client1.seekPartner()

    print()

    # 创建一个年龄小于18岁的客户示例
    client2 = Client("李四", 16)
    print("李四 16岁")
    client2.seekPartner()
posted @ 2026-01-03 13:33  liu某人  阅读(2)  评论(0)    收藏  举报