Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 对象适配器模式的用例_Java_Design Patterns_Adapter - Fatal编程技术网

Java 对象适配器模式的用例

Java 对象适配器模式的用例,java,design-patterns,adapter,Java,Design Patterns,Adapter,这就是适配器设计模式的使用方式吗 我有绘画类(实现形状)和正方形类(实现多边形)。现在,如果Draw和Square都无法修改,并且我需要客户端创建一个Square对象来进行“绘制”,那么我会选择适配器 下面的实现对象适配器模式还是类适配器模式 interface Shapes { public void draw(); } class Draw implements Shapes { @Override public void draw() { pri

这就是适配器设计模式的使用方式吗

我有绘画类(实现形状)和正方形类(实现多边形)。现在,如果Draw和Square都无法修改,并且我需要客户端创建一个Square对象来进行“绘制”,那么我会选择适配器

下面的实现对象适配器模式还是类适配器模式

interface Shapes {
    public void draw();
}

class Draw implements Shapes {

    @Override
    public void draw() {
        println("Drawing a shape");
    }
}


interface Polygon {
    public void getSides();
    public void getArea();
}

class Square implements Polygon {

    int length;

    Square(int length){
        this.length = length;
    }

    @Override
    public void getSides() {
        println("Sides: 4");
    }

    @Override
    public void getArea() {
        println("Area: "+length*length);
    }
}


class SquareAdapter extends Square{

    Shapes shape;

    public SquareAdapter(Shapes shape, int length){
        super(length);
        this.shape = shape;
    }

    public void draw(){
        shape.draw();
    }
}
客户端代码:

SquareAdapter adapter = new SquareAdapter(new Draw(), 3);
adapter.draw();
adapter.getArea();
adapter.getSides();
Draw drawingObj = null;

//Now lets say the client wants to draw a Square but it
//doesn't implement Draw
//drawingObj = new Square();
//drawingObj.draw() //this is not possible so we write a adapter

drawingObj = new SquareAdapter(new Square(5));
drawingObj.draw();
((SquareAdapter) drawingObj).getSquare().getSides();
((SquareAdapter) drawingObj).getSquare().getArea();



//class inheritance adapters

class SquareAdapter extends Square implements Draw {

    SquareAdapter(int length) {
        super(length);
    }

    @Override
    public void draw(){
        println("Drawing a square");
    }
}
Draw drawingObj = null;

//Now lets say the client wants to draw a Square but it
//doesn't implement Draw
//drawingObj = new Square();
//drawingObj.draw() //this is not possible so we write a adapter

drawingObj = new SquareAdapter(5);
drawingObj.draw();
((Square) drawingObj).getSides();
((Square) drawingObj).getArea();
更新1:解决方案

感谢斯坦尼斯拉夫。我以更合适的方式修改了这个例子

interface Draw {
    public void draw();
}

class Circle implements Draw {

    @Override
    public void draw() {
        println("Drawing a circle");
    }
}


interface Polygon {
    public void getSides();
    public void getArea();
}

class Square implements Polygon {

    int length;

    Square(int length){
        this.length = length;
    }

    @Override
    public void getSides() {
        println("Sides: 4");
    }

    @Override
    public void getArea() {
        println("Area: "+length*length);
    }
}

//object composition adapters

class SquareAdapter implements Draw {

    Polygon square;

    public SquareAdapter(Polygon square){
        this.square = square;
    }

    @Override
    public void draw(){
        println("Drawing a square");
    }

    public Polygon getSquare() {
        return square;
    }
}
客户端代码:

SquareAdapter adapter = new SquareAdapter(new Draw(), 3);
adapter.draw();
adapter.getArea();
adapter.getSides();
Draw drawingObj = null;

//Now lets say the client wants to draw a Square but it
//doesn't implement Draw
//drawingObj = new Square();
//drawingObj.draw() //this is not possible so we write a adapter

drawingObj = new SquareAdapter(new Square(5));
drawingObj.draw();
((SquareAdapter) drawingObj).getSquare().getSides();
((SquareAdapter) drawingObj).getSquare().getArea();



//class inheritance adapters

class SquareAdapter extends Square implements Draw {

    SquareAdapter(int length) {
        super(length);
    }

    @Override
    public void draw(){
        println("Drawing a square");
    }
}
Draw drawingObj = null;

//Now lets say the client wants to draw a Square but it
//doesn't implement Draw
//drawingObj = new Square();
//drawingObj.draw() //this is not possible so we write a adapter

drawingObj = new SquareAdapter(5);
drawingObj.draw();
((Square) drawingObj).getSides();
((Square) drawingObj).getArea();
客户端代码:

SquareAdapter adapter = new SquareAdapter(new Draw(), 3);
adapter.draw();
adapter.getArea();
adapter.getSides();
Draw drawingObj = null;

//Now lets say the client wants to draw a Square but it
//doesn't implement Draw
//drawingObj = new Square();
//drawingObj.draw() //this is not possible so we write a adapter

drawingObj = new SquareAdapter(new Square(5));
drawingObj.draw();
((SquareAdapter) drawingObj).getSquare().getSides();
((SquareAdapter) drawingObj).getSquare().getArea();



//class inheritance adapters

class SquareAdapter extends Square implements Draw {

    SquareAdapter(int length) {
        super(length);
    }

    @Override
    public void draw(){
        println("Drawing a square");
    }
}
Draw drawingObj = null;

//Now lets say the client wants to draw a Square but it
//doesn't implement Draw
//drawingObj = new Square();
//drawingObj.draw() //this is not possible so we write a adapter

drawingObj = new SquareAdapter(5);
drawingObj.draw();
((Square) drawingObj).getSides();
((Square) drawingObj).getArea();

适配器模式旨在成为两个不兼容接口之间的桥梁,但不是向现有对象添加新功能。就你而言

Draw和Square不允许修改,我需要客户创建一个Square对象来进行“绘制”

它看起来更像是装饰模式,旨在为现有对象创建新功能,而不改变其内部结构

所以,在适配器模式的情况下,适配器类必须实现Shapes接口,而您希望它有一个draw方法。尽管有两种类型的适配器—类适配器和对象适配器,但它们都需要接口实现

下面是最简单的适配器实现:

class SquareAdapter implements Shapes{

    Polygon square;

    public SquareAdapter(Polygon square){
        this.square = square;
    }

    public void draw(){
        //some logic to draw Square object
    }
}

适配器模式旨在成为两个不兼容接口之间的桥梁,但不是向现有对象添加新功能。就你而言

Draw和Square不允许修改,我需要客户创建一个Square对象来进行“绘制”

它看起来更像是装饰模式,旨在为现有对象创建新功能,而不改变其内部结构

所以,在适配器模式的情况下,适配器类必须实现Shapes接口,而您希望它有一个draw方法。尽管有两种类型的适配器—类适配器和对象适配器,但它们都需要接口实现

下面是最简单的适配器实现:

class SquareAdapter implements Shapes{

    Polygon square;

    public SquareAdapter(Polygon square){
        this.square = square;
    }

    public void draw(){
        //some logic to draw Square object
    }
}

请检查我作为编辑添加到上述帖子的答案。这个示例代码是有意义的,对吗?是的,这两种适配器模式类型的用法似乎都是正确的,因为在这种情况下,您可以使用适配器类作为shapes的实例。请检查我作为编辑添加到上述文章中的答案。这个示例代码是有意义的,对吗?是的,这两种适配器模式类型的用法似乎都是正确的,因为在这种情况下,您可以使用适配器类作为形状的实例