C#入門(第15回)

前回振り返り

Facadeパターン

Facadeパターンは、サブシステム(下位機能)を統合して、より使いやすい高水準インタフェースを提供する。

このパターンでは、Facadeクラスが窓口となり、サブシステム内部に仕事を投げるだけで複雑な実装は持たない。とはいえ、Facadeクラスの利用は強制ではなく、必要であればサブシステムの機能を直接利用できる。言語によっては無名名前空間やPackageスコープによりサブシステムを利用者から隔離できるが、Facadeパターンはそのような制限はしない。

Facadeパターンのクラス図

前回演習問題の解答 例

問題1

問題文

Facadeパターン を作成してみましょう。

wikipedia のJava実装例をC#で記述してみましょう。


解答例

public class FacadeTest
{
    public static void Main(String[] argv)
    {
        new DrivingSimulator().simulate();
    }
}
class Car
{
    private int speed;
    private int distance;
    public Car()
    {
        this.speed = 0;
        this.distance = 0;
    }
    public void setSpeed(int speed)
    {
        this.speed = speed;
    }
    public void run(int minutes)
    {
        this.distance += minutes * this.speed;
    }
    public int getDistance()
    {
        return this.distance;
    }
}
class Driver
{
    private Car car;
    public Driver(Car car)
    {
        this.car = car;
    }
    public void pushPedal(int speed)
    {
        this.car.setSpeed(speed);
    }
    public void drive(int minutes)
    {
        this.car.run(minutes);
    }
}
public class DrivingSimulator
{
    public void simulate()
    {
        Car c = new Car();
        Driver d = new Driver(c);
        d.pushPedal(700);
        d.drive(30);
        d.pushPedal(750);
        d.drive(20);
        Console.WriteLine("The travel distance is " + c.getDistance() + " m.");
    }
}

問題2

問題文

問1のDrivingSimulator#simulateでは、pushPedalメソッドの引数に分速を渡しているが、時速に変更するとどうなるでしょうか。


解答例

public class FacadeTest
{
    public static void Main(String[] argv)
    {
        new DrivingSimulator().simulate();
    }
}
class Car
{
    private int speed;
    private int distance;
    public Car()
    {
        this.speed = 0;
        this.distance = 0;
    }
    public void setSpeed(int jisoku)
    {
        this.speed = jisoku * 1000 / 60;
    }
    public void run(int minutes)
    {
        this.distance += minutes * this.speed;
    }
    public int getDistance()
    {
        return this.distance;
    }
}
class Driver
{
    private Car car;
    public Driver(Car car)
    {
        this.car = car;
    }
    public void pushPedal(int jisoku)
    {
        this.car.setSpeed(jisoku);
    }
    public void drive(int minutes)
    {
        this.car.run(minutes);
    }
}
public class DrivingSimulator
{
    public void simulate()
    {
        Car c = new Car();
        Driver d = new Driver(c);
        d.pushPedal(42);
        d.drive(30);
        d.pushPedal(45);
        d.drive(20);
        Console.WriteLine("The travel distance is " + c.getDistance() + " m.");
    }
}

今回の演習問題

問題1

問題文

State パターン を作成してみましょう。

wikipedia のJava実装例をC#で記述してみましょう。

問題2

問題文

問1のクラスを身近なものにアレンジしてみましょう。

コメント