See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
Visitor pattern – Wikipedia tiếng Việt

Visitor pattern

Bách khoa toàn thư mở Wikipedia

Mục lục

[sửa] Giới thiệu

Trong thiết kế hướng đối tượng, Visitor là mẩu thiết kế(Design Patterns) cho phép định nghĩa các thao tác(operations) trên một tập hợp các đối tượng (objects) không đồng nhất (về kiểu) mà không làm thay đổi định nghĩa về lớp(classes) của các đối tượng đó. Để đạt được điều này, trong mẩu thiết kế visitor ta định nghĩa các thao tác trên các lớp tách biệt gọi các các lớp visitors, các lớp này cho phép tách rời các thao tác với các đối tượng mà nó tác động đến. Với mỗi thao tác được thêm vào, một lớp visitor tương ứng được tạo ra.

[sửa] Thiết kế

Thiết kế của mẫu visitor gồm 3 phần:

[sửa] Các lớp visitor

Các lớp visitor định nghĩa các thao tác tương tác trên các đối tượng. Các lớp này là cài đặt của một giao diện chung là VisitorInterface trong đó định nghĩa các phương thức dạng visit(ObjectType object),với mỗi kiểu (lớp) của của các đối tượng ta có một phương thức visit với tham số truyền vào là một thực thể của kiểu đó.Mỗi phương như thế có nhiệm vụ xử lý trên các thực thể của lớp tương ứng. Ví dụ ta có tập hợp các đối tượng là các thực thể của hai kiểu(lớp) ClassA và ClassB thì VisitorInterface sẽ bao gồm hai phương thức:

visit(ClassA obj)
visit(ClassB obj)

[sửa] Các lớp của các đối tượng trong tập hợp các đối tượng

Để các thao tác định nghĩa trong các lớp visitor có thể thực hiện được, các lớp của các đối tượng trong tập hợp các đối tượng cần cài đặt giao diện Visitable trong đó có một phương thức accept(VisitorInterface visitor). Trong cài đặt của phương thức này ta gọi hàm visit của visitor với tham số truyền vào chính là đối tượng gọi:

public void accept(VisitorInterface visitor){
    visitor.visit(this);
}

[sửa] Client

Các client muốn thực thi thao tác của visitor trên tập hợp các đối tượng cần phải tạo ra một thực thể của lớp vistor tương ứng với thao tác đó, và sau đó gọi phương thức accept của từng đối tượng trong tập hợp các đối tượng với tham số là thực thể visitor vừa tạo ra. (Xem ví dụ để hiểu rõ hơn)

[sửa] Ví dụ

Sau đây là một ví dụ đơn giản minh học áp dụng của mẫu thiết kế trên và cũng để hiểu rõ thêm về cài đặt của nó.

[sửa] Sơ đồ lớp của ví dụ bằng UML

Hình:Wiki visitor.png

[sửa] Cài đặt bằng Java

Sau đây là cài đặt của ví dụ trên bằng ngôn ngữ Java

interface Visitor {
    void visit(Wheel wheel);
    void visit(Engine engine);
    void visit(Body body);
    void visit(Car car);
}

//differing from above displayed UML: Additional use of an interface 'Visitable'
interface Visitable {
    public void accept(Visitor visitor);
}

class Wheel implements Visitable {
    private String name;
    Wheel(String name) {
        this.name = name;
    }
    String getName() {
        return this.name;
    }
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

class Engine implements Visitable{
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

class Body implements Visitable{
    public void accept(Visitor visitor) {
        visitor.visit(this);
    }
}

class Car implements Visitable {
    private Engine  engine = new Engine();
    private Body    body   = new Body();
    private Wheel[] wheels 
        = { new Wheel("front left"), new Wheel("front right"),
            new Wheel("back left") , new Wheel("back right")  };
    public void accept(Visitor visitor) {
        visitor.visit(this);
        engine.accept( visitor );
        body.accept( visitor );
        for(int i=0; i<wheels.length; ++i)
            wheels[i].accept( visitor );
    }
}

class PrintVisitor implements Visitor {
    public void visit(Wheel wheel) {
        System.out.println("Visiting "+wheel.getName()
                            +" wheel");
    }
    public void visit(Engine engine) {
        System.out.println("Visiting engine");
    }
    public void visit(Body body) {
        System.out.println("Visiting body");
    }
    public void visit(Car car) {
        System.out.println("Visiting car");
    }
}

public class VisitorDemo {
    static public void main(String[] args){
        Car car = new Car();
        Visitor visitor = new PrintVisitor();
        car.accept(visitor);
    }
}


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -